ファイル名で特定の正規表現を探していて、独自の方法で親フォルダとそのサイズを返したいと思います。
たとえば、以下は私が動作すると予想されるコマンドです。
find -E . -type f -regex '.*[fF][oO][oO].*' -maxdepth 2 | rev | cut -d'/' -f2- | rev | egrep -v '\.$' | uniq | xargs du -sh
xargs: unterminated quote
ファイル名の引用符が異なるため失敗します。
find
だから私はwith-print0
とxargs
withを使うようになりました-0
:
find -E . -type f -regex '.*[fF][oO][oO].*' -maxdepth 2 -print0 | rev | cut -d'/' -f2- | rev | egrep -v '\.$' | uniq | xargs -0 du -sh
しかし、最終的にエラーが発生しました。これは明らかにfind形式の出力を変更したdu: Binary file (standard input) matches
ためです。uniq
-print0
親フォルダの下で一致するファイルまたはフォルダを検索するときは、親フォルダのサイズを見つけることをお勧めします。繰り返します。サブフォルダのパスやファイル情報なしで最上位のフォルダ名とそのサイズ(du -sh
)のみを見つけて、一致する基準に合ったきちんとしたデフォルトのフォルダのリストを作成したいと思います。
ベストアンサー1
rev
どちらegrep
もuniq
ゼロを食べて線を見ます。 GNUがある場合find
そしてuniq
次のように多くの単純化が可能です。
find ...tests... -printf '%h\0' | uniq -z | xargs -0 du -sh
GNUfind
の-printf
オプションは、各ファイルの出力を記述する形式を取ります。%h
ファイル名を含まないパス形式で、\0
0 で終了します。uniq -z
各レコードをゼロで終了するように指示します。それ以外の場合は、1行だけが表示され、本質的に前のように続行できますcat
。xargs
それは考えることができるsort -z -u
uniq
順序付けされていない名前を考慮するよりも優れています。ただし、最大深度要件は、中間の項目.
だけが複数回表示されることを意味します。-mindepth 2
これも避けます。
ファイル名にゼロがない場合