検索検索基準を使用するときに親フォルダのサイズを取得しますか?

検索検索基準を使用するときに親フォルダのサイズを取得しますか?

ファイル名で特定の正規表現を探していて、独自の方法で親フォルダとそのサイズを返したいと思います。

たとえば、以下は私が動作すると予想されるコマンドです。

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-print0xargswithを使うようになりました-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どちらegrepuniqゼロを食べて線を見ます。 GNUがある場合findそしてuniq次のように多くの単純化が可能です。

find ...tests... -printf '%h\0' | uniq -z | xargs -0 du -sh

GNUfind-printfオプションは、各ファイルの出力を記述する形式を取ります。%hファイル名を含まないパス形式で、\00 で終了します。uniq -z各レコードをゼロで終了するように指示します。それ以外の場合は、1行だけが表示され、本質的に前のように続行できますcatxargs

それは考えることができるsort -z -uuniq順序付けされていない名前を考慮するよりも優れています。ただし、最大深度要件は、中間の項目.だけが複数回表示されることを意味します。-mindepth 2これも避けます。

ファイル名にゼロがない場合

答え2

例コマンドの最も複雑な点は、ディレクトリ名を取得することです。-printfオプションを使用すると、これをより簡単かつ直接的に達成できますfind。ディレクトリを作成するための形式があります%h。これを使用すると、コマンドが大幅に簡素化されます。

ディレクトリのみを作成するには、次を使用します。

find ... -type f ... -printf '%h\n'

終了した行にもこれを使用できます\0

find ... -type f ... -printf '%h\0'


\0問題の2番目のコマンドには追加の問題があります。ラインで動作するコマンドパイプラインを使用しますが、入力はラインではありません。行の終了に使用したのと同じ改行文字はありません。つまり、出力全体が1行に表示されます。

関連情報