パスワード

パスワード

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

ls -l | wc -l

を通じて識別するすべてのフォルダについてfind

パスワード

以下のコードは、名前で含まれる各フォルダのファイル数を正しく一覧表示します。マジックデータひも。

find /path/to/cool/stuff                        \         
        -maxdepth 4                             \         
        -type d                                 \         
        -name '*Magic Data*'                    \         
        -print0 | xargs                         \         
                --verbose                       \         
                -0 -I {} ls -l {}               

それを拡張し、結果lswc -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つの主な方法があります。

  1. find目的のディレクトリにのみ移動し、その中の各ファイルの文字を印刷するようにコマンドを変更します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 %d\n" "$dir" "$#"' bash {} ';'

ここでは、あなたがしたようにディレクトリを見つけて、各ディレクトリに対して次の短いbashスクリプトを実行します。

dir=$1
set -- "$dir"/*
printf "%s %d\n" "$dir" "$#"

findこれはコマンドラインからディレクトリのパス名(から提供)を取得し、*その中のglobパターンを拡張します。スクリプトのコマンドラインでシェルオプションを設定すると、dotglob隠しファイルとディレクトリも計算されます(非表示の-O dotglob名前を計算したくない場合は削除)。

すべての名前をパラメータに拡張して、set位置パラメータを拡張項目に設定します。場所引数の数はそのまま使用できるため、特定のディレクトリに$#あるファイルの数でもあります。

関連:

答え2

試したソリューションから始めてこれを行う方法は次のとおりです。

find /path/to/cool/stuff                        \         
        -maxdepth 4                             \         
        -type d                                 \          
        -name '*Magic Data*'                    \
        -exec sh -c '
           for d do
              printf "%s: " "$PWD/$d"
              find "$d/." -maxdepth 1 ! -name . -printf "\\n" | wc -l
           done
       ' find_sh {} +

説明する:

  • findまで-イギリスターゲットディレクトリはレシピに従ってください。
  • ターゲットディレクトリ、つまりデフォルト名のどこかに「Magic Data」という文字列を含むディレクトリを見つけたら、それを一括して集め、引数リストを介して{} +シェルに渡します。shsh -c '...' find_sh {} +
  • 初期引数はsh0番目の引数なので、$0任意の名前を指定できます。この場合、名前をとして指定しましたfind_sh。プロセスリストに表示される名前です。
  • ターゲットディレクトリバンドルは、私たちが作成するシェルのパラメータ{} +に入り、それを形成します。$1 $2 $3 ...
  • 起動したばかりのシェルでは、ターゲットディレクトリ(自体を除く)、OTW内の各ファイルに対して改行がエクスポートされ、ターゲット! -name .ディレクトリ名もwc -l出力に含まれます。

答え3

次のコマンドを使用して必要なものを取得することもできます

ここではシェルをexec実行し、オプションを使用して与えられたコマンドを実行します。あなたの場合、コマンドは次のとおりですsh-cls -1 | wc -l

find /path/to/cool/stuff    -maxdepth 4  -type d  -name '*Magic Data*' -print0 -exec sh -c "ls -1 {} | wc -l" \;

関連情報