我想找到当前目录的一个子目录,其中(即子目录)包含2个或更多常规文件。
我对包含少于 2 个文件的目录不感兴趣,也不对仅包含子目录的目录感兴趣。
答案1
这是一种基于 GNUfind
和uniq
.与基于执行 shell 命令(对找到的每个目录的文件进行计数)的答案相比,这要快得多,而且对 CPU 更友好。
find . -type f -printf '%h\n' | sort | uniq -d
该find
命令打印层次结构中所有文件的目录,并且uniq
仅显示至少出现两次的目录。
答案2
在...的帮助下吉尔斯的回答在苏及其相反和一些修改,这就是您所需要的。
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
答案3
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 ]
该脚本将计算第一个命令行参数(来自 )给出的目录中常规文件的数量(跳过符号链接)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
答案4
其他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 个或更多常规文件的子文件夹名称/路径