Answers:
这是基于GNU find
和的完全不同的方法uniq
。这比基于执行shell命令(对找到的每个目录的文件计数)的答案要快得多,并且对CPU友好得多。
find . -type f -printf '%h\n' | sort | uniq -d
该find
命令将打印层次结构中所有文件uniq
的目录,并且仅显示至少出现两次的目录。
-printf '%h\0' | sort -z | uniq -zd | xargs -r0 ...
find . -type d \
-exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' \
-print
这将在当前目录中或当前目录下找到所有名称,然后过滤掉不是目录名称的所有名称。
其余的目录名称将被赋予以下简短脚本:
c=0
for n in "$1"/*; do
[ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 ))
done
[ "$c" -ge 2 ]
该脚本将计算作为第一个命令行参数(from find
)给出的目录中常规文件(跳过符号链接)的数量。脚本中的最后一个命令是测试,以查看计数是否为2或更大。该测试的结果是脚本的返回值(退出状态)。
如果测试成功,-print
将导致find
打印出该目录的路径。
要同时考虑隐藏文件(名称以点开头的文件),请更改sh -c
脚本
for n in "$1"/*; do
至
for n in "$1"/* "$1"/.*; do
测试:
$ tree
.
`-- test
|-- a
|-- dir1
| |-- a
| |-- b
| `-- c
`-- dir2
|-- dira
|-- dirb
| |-- file-1
| `-- file-2
`-- dirc
6 directories, 6 files
$ find . -type d -exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' -print
./test/dir1
./test/dir2/dirb
[ "" -ge 2 ]
是有效的测试。
dash
,bash --posix
并且test
全部显示错误消息并退出并显示2(即“发生错误”)
ksh
身份运行的系统上进行测试sh
。将立即修改。谢谢你戳我!:-)
[ -f ... ]
取消引用符号链接。您应该添加测试以消除它们,因为该问题指定仅应计数常规文件。
借助Gilles对SU 的回答及其反面和一些修改,这里是您需要的。
find . -type d -exec sh -c 'set -- "$1"/*;X=0;
for args; do [ -f "$args" ] && X=$((X+1)) ;done; [ "$X" -gt 1 ] ' _ {} \; -print
目录树。
.
├── test
│ ├── dir1
│ │ ├── a
│ │ ├── b
│ │ └── c
│ ├── dir2
│ │ ├── dira
│ │ │ └── a file\012with\012multiple\012line
│ │ ├── dirb
│ │ │ ├── file-1
│ │ │ └── file-2
│ │ └── dirc
│ ├── diraa
│ ├── dirbb
│ ├── dircc
│ └── x
│ └── x1
│ └── x2
└── test2
├── dir3
└── dir4
结果:
./test
./test/dir1
./test/dir2/dirb
test
和dir2
目录(请参阅我的答案)。
test/x1
和test/x2
作为文件...,$1
并且$2
将是的目录test
,并且该目录将丢失。
另find
+ wc
方法:
find path/currdir -maxdepth 1 -type d ! -empty ! -path "path/currdir" \
-exec sh -c 'count=$(find "$1" -maxdepth 1 -type f | wc -l); [ $count -ge 2 ]' _ {} \; -print
path/currdir
-当前目录的路径
-maxdepth 1
-仅考虑直接子文件夹
! -empty
-忽略空的子文件夹
! -path "path/currdir"
-忽略当前目录路径
count=$(find "$1" -maxdepth 1 -type f | wc -l)
- count
为找到的每个子文件夹分配文件数
[ $count -ge 2 ] ... -print
-打印包含2个或更多常规文件的子文件夹名称/路径
find
。在这种情况下,因为GNUfind
会破坏具有在当前语言环境中不可打印的字符的目录名称(例如C语言环境中的“ä”)。又见unix.stackexchange.com/questions/321697/...