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


13

希望我可以使用该find命令执行此操作,但是我看不到手册中有任何测试可用于执行所需操作。我希望能够在工作目录中找到包含小于,大于或完全等于我指定的计数的任何目录。

find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries

但是a,没有这样的选择。


尝试类似“ ls -al | wc -l | grep”的内容
Vanadis

Answers:


16

您可以尝试这样做,以获取子目录名称以及它们包含的文件/目录的数量:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

如果要对所有子目录(递归查找)执行相同的操作,请改用此方法:

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

要选择具有恰好10个文件的目录,请执行以下操作:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'

10以上:

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

10以下:

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

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

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

1
我认为包括awk命令以减少文件计数(即最后一个以空格分隔的列)可能很有用,以防发问者想将输出传递给其他内容。
evilsoup

1
@evilsoup好主意,完成了。

在目录名称中支持空格和特殊字符;试图扭转单,双引号这样的用法:find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
哈佛Geithus

3

列出包含确切 $NUM文件的立即子目录。

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'

若要列出包含子目录即时更大的$NUM文件。

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'

若要列出包含子目录立即较少$NUM文件。

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'

项目以空字符终止\0,因此将正确解释包含换行符或其他类型的空白的文件名。在%h打印每个文件的dirnameawk然后使用数组计算遇到每个目录的次数,如果满足条件,则打印该目录。

请注意,上述命令均不会显示包含零个文件的目录。还要注意,按文件我指的是常规文件,而不是链接,目录,套接字,块,命名管道等。

我试图做到这一点尽可能简单。如果要查找递归子目录或其中的文件,则需要修改的命令。列出它们的可能性太多。


2

尝试这个:

[`找到。| wc -l` -eq 10] && echo“找到”

[`找到。| wc -l` -gt 10] && echo“ Found”

[`找到。| wc -l` -lt 10] && echo“ Found”

在此示例中,您可以检查CURRENT目录是否恰好包含10个文件,然后包含10个文件/目录。如果需要检查一堆目录,请使用循环。


您的解决方案还会计算当前目录(.),您可能需要进行相应的修改。
terdon

我喜欢这个答案的主旨(因为我是在shell中做事的嘴),但是最好wc -l < <(printf %s\\n ./*)还是printf %s\\n ./* | wc -l在测试中使用它,以避免不必要的find调用。这还将避免@terdon指出的问题包括.在结果中。但是,这也会遇到忽略以.; 开头的文件的问题。我可以用shopt -s dotglob(使glob匹配以开头的文件.,而不是...)解决此问题。
evilsoup

@terdon不重要。这不是最终的解决方案,仅是示例和想法。最终版本可以为-1或将10更改为11。
9

我知道,这个主意很好,所以我提出了这个建议。
terdon

@ terdon。谢谢。可能有许多不同的要求,例如:只计算文件,不计算目录,链接或硬链接。计数或不统计子目录中的文件。计算隐藏文件(例如.bashrc)... ...因此您的表情可以是veooeery loooong。:)
2013
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.