我希望能够使用命令来执行此操作find
,但我在手册中找不到可以执行我想要的操作的测试。我希望能够在工作目录中找到包含小于、大于或正好等于我指定的计数的任何目录。
find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries
但遗憾的是,没有这样的选择。
答案1
您可以尝试这样做,获取子目录名称以及它们包含的文件/目录的数量:
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}'
答案2
Terdon 的回答通常可以很好地说明正确的方法,但这里有一个稍微简短的答案,它只使用find
和bash
(不需要ls
,wc
和awk
),并且还可以处理包含换行符的文件或目录。
find . -type d -exec /bin/bash -c 'a=( "{}"/* ); [[ ${#a[*]} == 10 ]]' ';' -print
答案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
每个文件的dirname
。awk
然后使用数组来计算遇到每个目录的次数,如果满足条件则打印它。
请注意,上述命令都不会显示包含零个文件的目录。另请注意,我指的文件是指常规文件,不是链接、目录、套接字、块、命名管道等等。
我已尝试尽可能简单地执行此操作。如果要查找递归子目录或其中的文件,则需要修改命令。可能性太多,无法全部列出。
答案4
使用贪婪的 grep 查找恰好有 20 个文件的目录
find -type f | grep -o '.*\/' | sort | uniq -c | grep -e '^\s+20'