查找包含一定数量文件的目录

Pau*_*ane 20 linux find

希望我能够用find命令来做到这一点,但我在手册中看不到任何测试来做我想做的事。我希望能够在工作目录中找到包含小于、大于或恰好是我指定的计数的任何目录。

find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries
Run Code Online (Sandbox Code Playgroud)

但可惜没有这样的选择。

ter*_*don 25

您可以尝试此操作,以获取子目录名称及其包含的文件/目录数:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;
Run Code Online (Sandbox Code Playgroud)

如果您想对所有子目录(递归查找)执行相同操作,请改用:

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;
Run Code Online (Sandbox Code Playgroud)

选择那些正好有 10 个文件的目录:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'
Run Code Online (Sandbox Code Playgroud)

10个或更多:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF>=10'
Run Code Online (Sandbox Code Playgroud)

10 或更少:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF<=10'
Run Code Online (Sandbox Code Playgroud)

如果您只想保留目录名称(例如,您想按照@evilsoup 的建议将其通过管道传输到下游的另一个进程),您可以使用以下命令:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; | 
 awk -F"\t" '$NF<=10{print $1}'
Run Code Online (Sandbox Code Playgroud)


小智 6

Terdon 的答案通常很好地说明了正确的方法,但是这里有一个稍微简短的答案,它只使用findand bash(不需要ls, wcand awk),并且还可以处理包含换行符的文件或目录。

find . -type d -exec /bin/bash -c 'a=( "{}"/* ); [[ ${#a[*]} == 10 ]]' ';' -print

  • (供我将来参考)这会迭代使用 `find` 找到的目录,并使用 `a=( "{}"/* )` 将每个目录的 `a` 变量设置为目录内容的数组。然后将数组中的元素数量“${#a[*]}”与“10”进行比较。如果元素数量确实为“10”,则“-exec”命令返回 true(由于 bash 的“0”退出代码)。由于 `-exec` 返回 true,因此执行 `-print` 参数并打印目录名称,表明列出的目录中正好有 `10` 个文件/目录。 (2认同)