端末で「find」出力を区切るには、スペースを使用してください。

端末で「find」出力を区切るには、スペースを使用してください。

私は、次のように、find20以上の特定の種類()を含むすべての.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

次のコードは、フォルダ名をスペースで区切って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") }'

行の末尾に余分なスペースがありますが、追加のコードも防止されます。 1つの可能性:

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" }'

関連情報