我用来find
查找包含超过 20 个特定类型 ( .txt
) 的所有文件夹,如下所示:
find . -type f -iname '*.txt' -printf '%h\n'|sort|uniq -c | awk '$1 > 20'
输出看起来像:
44 ./fold9863
202 ./fold689
122 ./fold45
202 ./fold2
数字显示每个文件夹中 .txt 文件的数量。有什么方法可以使用 find 来获取不带数字(并且不带前导./
)但以空格分隔的文件夹名称?像这样:
fold9863 fold689 fold45 fold2
答案1
以下代码将文件夹名称打印在一行上,并用一个空格分隔:
find . -type f -iname '*.txt' -printf '%h\n'|sort|uniq -c | \
awk '$1 > 20 { sub("^[.]/","",$2); printf("%s ",$2) } END { printf("\n") }'
需要注意的是,如果文件夹名称包含空格,则在使用该列表时可能会出现问题。可以引用这些名称:
find . -type f -iname '*.txt' -printf '%h\n'|sort|uniq -c | \
awk '$1 > 20 { sub("^[.]/","",$2); printf("\"%s\" ",$2) } END { printf("\n") }'
行尾有一个额外的空格,但也可以避免额外的代码。一种可能性:
find . -type f -iname '*.txt' -printf '%h\n'|sort|uniq -c | \
awk '$1 > 20 {sub("^[.]/","",$2);printf("%s\"%s\"",X,$2);X=" "} END {printf("\n")}'
答案2
将您的awk
表达式替换为此表达式,这会删除./
文件夹名称中的任何前导
awk '$1 > 20 { sub("^\\./", "", $2); printf "%d\t%s\n", $1, $2 }'
要在行中而不是在列中获取文件夹名称,请awk
再次修改,这次是为了避免打印数字
awk '$1 > 20 { sub("^\\./", "", $2); printf "%s ", $2 } END { printf "\n" }'