ディレクトリツリーを再帰的に検索し、指定された文字列に対応する名前で各フォルダで利用可能なファイルの数を一覧表示したいと思います。実際に次の結果を返したいと思います。
ls -l | wc -l
を通じて識別するすべてのフォルダについてfind
。
パスワード
以下のコードは、名前で含まれる各フォルダのファイル数を正しく一覧表示します。マジックデータひも。
find /path/to/cool/stuff \
-maxdepth 4 \
-type d \
-name '*Magic Data*' \
-print0 | xargs \
--verbose \
-0 -I {} ls -l {}
それを拡張し、結果ls
をwc -l
。
試みる
find /path/to/cool/stuff \
-maxdepth 4 \
-type d \
-name '*Magic Data*' \
-print0 | xargs \
--verbose \
-0 -I {} ls -l {} | wc -l
これは失敗し、次のように印刷されます。
ls -l /path/to/cool/stuff/some/folders/Magic Data
ls -l /path/to/cool/stuff/some/folders2/Magic Data
希望の出力
/path/to/cool/stuff/some/folders/Magic Data 29
/path/to/cool/stuff/some/folders2/Magic Data 30
希望の出力には以下が含まれます。
- フォルダのフルパスを検索
- の出力
wc -l
(この場合は隠されていないファイルの数を反映します)
ベストアンサー1
この問題を解決する2つの主な方法があります。
find
目的のディレクトリにのみ移動し、その中の各ファイルの文字を印刷するようにコマンドを変更しますx
(例:)。次に、生成された文字数を計算しますwc -l
。 Unixのパス名には改行文字を含めることができるため、出力文字はパス名よりも安全です。このソリューションは、-prune
興味のないディレクトリを無視するか、! -path
。これまでと同様に、ディレクトリを見つけてインラインスクリプトを使用してその中のファイル数を数えます。以下に示しますが、これは簡単です。
find /path/to/cool/stuff -maxdepth 4 -type d -name "*Magic Data*' \
-exec bash -O dotglob -c '
dir=$1
set -- "$dir"/*
printf "%s %d\n" "$dir" "$#"' bash {} ';'
ここでは、あなたがしたようにディレクトリを見つけて、各ディレクトリに対して次の短いbash
スクリプトを実行します。
dir=$1
set -- "$dir"/*
printf "%s %d\n" "$dir" "$#"
find
これはコマンドラインからディレクトリのパス名(から提供)を取得し、*
その中のglobパターンを拡張します。スクリプトのコマンドラインでシェルオプションを設定すると、dotglob
隠しファイルとディレクトリも計算されます(非表示の-O dotglob
名前を計算したくない場合は削除)。
すべての名前をパラメータに拡張して、set
位置パラメータを拡張項目に設定します。場所引数の数はそのまま使用できるため、特定のディレクトリに$#
あるファイルの数でもあります。
関連: