Answers:
您可以尝试这样做,以获取子目录名称以及它们包含的文件/目录的数量:
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}'
find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
列出包含确切 $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
然后使用数组计算遇到每个目录的次数,如果满足条件,则打印该目录。
请注意,上述命令均不会显示包含零个文件的目录。还要注意,按文件我指的是常规文件,而不是链接,目录,套接字,块,命名管道等。
我试图做到这一点尽可能简单。如果要查找递归子目录或其中的文件,则需要修改的命令。列出它们的可能性太多。
尝试这个:
[`找到。| wc -l` -eq 10] && echo“找到”
[`找到。| wc -l` -gt 10] && echo“ Found”
[`找到。| wc -l` -lt 10] && echo“ Found”
在此示例中,您可以检查CURRENT目录是否恰好包含10个文件,然后包含10个文件/目录。如果需要检查一堆目录,请使用循环。
.
),您可能需要进行相应的修改。
wc -l < <(printf %s\\n ./*)
还是printf %s\\n ./* | wc -l
在测试中使用它,以避免不必要的find
调用。这还将避免@terdon指出的问题包括.
在结果中。但是,这也会遇到忽略以.
; 开头的文件的问题。我可以用shopt -s dotglob
(使glob匹配以开头的文件.
,而不是.
或..
)解决此问题。