ファイル名で特定の正規表現を探していて、独自の方法で親フォルダとそのサイズを返したいと思います。
たとえば、以下は私が動作すると予想されるコマンドです。
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
これも避けます。
ファイル名にゼロがない場合
答え2
例コマンドの最も複雑な点は、ディレクトリ名を取得することです。-printf
オプションを使用すると、これをより簡単かつ直接的に達成できますfind
。ディレクトリを作成するための形式があります%h
。これを使用すると、コマンドが大幅に簡素化されます。
ディレクトリのみを作成するには、次を使用します。
find ... -type f ... -printf '%h\n'
終了した行にもこれを使用できます\0
。
find ... -type f ... -printf '%h\0'
\0
問題の2番目のコマンドには追加の問題があります。ラインで動作するコマンドパイプラインを使用しますが、入力はラインではありません。行の終了に使用したのと同じ改行文字はありません。つまり、出力全体が1行に表示されます。