在终端中使用空格分隔“find”的输出

在终端中使用空格分隔“find”的输出

我用来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" }'

相关内容