GNU/Linux >> Linux の 問題 >  >> Linux

フォルダ名がパターンと一致する各フォルダ内のファイル数を一覧表示しますか?

ディレクトリツリーを再帰的に検索し、特定の文字列に対応する名前を持つ、各フォルダで使用可能なファイルの数を一覧表示したいと思います。事実上、次の結果を返したいと思います:

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つの方法があります。

  1. findを変更します 関心のあるディレクトリにのみ入力し、1文字を出力するようにコマンドを実行します(例:x )内で見つかったファイルごとに。次に、wc -lで生成されたその文字の数を数えます 。 Unixのパス名には改行が含まれている可能性があるため、パス名よりも文字を出力する方が安全です。このソリューションは、-pruneを使用するため、少し注意が必要です。 関心のないディレクトリを無視するか、! -path

  2. これまでと同じようにディレクトリを見つけますが、インラインスクリプトを使用して、その中のファイルのカウントを行います。これはもっと簡単で、以下に示しています。

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を削除します) 非表示の名前をカウントしないようにします。

関連:VirtualBoxゲスト内のUSBデバイスへのアクセスを有効にする方法は?

setへの引数としてすべての名前の展開を行います 、これにより、位置パラメータが展開されたエントリに設定されます。位置パラメータの数は、$#として利用できます。 、したがって、その特定のディレクトリ内のファイルの数でもあります。

関連:

  • `find`の-execオプションを理解する

Linux
  1. ディレクトリとサブディレクトリ内のファイル数を見つける方法

  2. ディレクトリ内のファイル数を数える最良の方法は何ですか?

  3. パターンに一致する特定のファイルを検索する方法は?

  1. 多数のXmlファイルを再フォーマットしますか?

  2. 1日あたりのフォルダ内のファイル数を数えますか?

  3. Linux で名前に無効な Windows 文字を含むファイルを検索する

  1. ファイル名に次より大きい番号が含まれるファイルを検索

  2. OSX端末コマンドでディレクトリ内のファイル数をカウントする

  3. 見つかったファイルの総行数を数えるには?