ディレクトリツリーを再帰的に検索し、特定の文字列に対応する名前を持つ、各フォルダで使用可能なファイルの数を一覧表示したいと思います。事実上、次の結果を返したいと思います:
ls -l | wc -l
find
で特定したフォルダごとに 。
コード
以下のコードは、名前に Magic Dataが含まれている各フォルダ内のファイルの数を正しくリストしています。 文字列。
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
の出力 、この場合、非表示にされていないファイルの数を反映します
承認された回答:
これを解決するには、主に2つの方法があります。
-
find
を変更します 関心のあるディレクトリにのみ入力し、1文字を出力するようにコマンドを実行します(例: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 %dn" "$dir" "$#"' bash {} ';'
ここでは、あなたと同じようにディレクトリを見つけ、ディレクトリごとに、この短いbash
を実行します。 スクリプト:
dir=$1
set -- "$dir"/*
printf "%s %dn" "$dir" "$#"
これは、コマンドラインからディレクトリのパス名を取得します(find
で指定) )、*
を展開します その中のグロブパターン。 dotglob
を設定する スクリプトのコマンドラインのシェルオプションでは、非表示のファイルとディレクトリもカウントされることが保証されています(-O dotglob
を削除します) 非表示の名前をカウントしないようにします。
set
への引数としてすべての名前の展開を行います 、これにより、位置パラメータが展開されたエントリに設定されます。位置パラメータの数は、$#
として利用できます。 、したがって、その特定のディレクトリ内のファイルの数でもあります。
関連:
- `find`の-execオプションを理解する