他の「find -exec」の中に「find -exec」を入れ子にできますか?

他の「find -exec」の中に「find -exec」を入れ子にできますか?

次のようなものが私が求めているものです。しかし、どのように脱出しても、私のコードは機能しません{}+ ;

find ./ -maxdepth 1 -type d -name '.*' -exec \
    find {} -maxdepth 1 -type f -name '*.ini' -exec \
        md5sum \{\} \\; \;

これを見た後UnixとLinuxの問題、次のコードは動作しますが、入れ子になっていません。探すだから私はこの特定のタスクを実行するより良い方法があると思います。

find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
    find "$x" -maxdepth 1 -type f -name "*.ini" \
    -exec md5sum \{\} \;; \
done' _ {} \+

find -exec上記のように、シェルと奇妙な引用とエスケープ制約を呼び出さずに入れ子にする方法はありますか?

それとも、複数のパラメータを混合して単一のfindコマンドで直接実行できますか?

答え1

次の単一の検索を試してみましょう。

find .*/ -maxdepth 1 -type f -name '*.ini' -execdir md5sum {} +

または(findまったくない、シェルワイルドカードのみを使用)

md5sum .*/*.ini

ただし、ここにはチェックがありません。 で-type f終わるディレクトリ/非ファイルがない場合にのみ機能します.ini。これにより使用できます。

for x in .*/*.ini; do 
    if [ -f "$x" ]; then 
        md5sum "$x"
    fi
done

しかし、これは1回のmd5sum呼び出ししか必要とされないという利点を失います。

編集する

一般的で安全な接続方法の場合は、find次のようにできます。

find <paths> <args> -print0 | xargs -0 -I{.} find {.} <args for second find> [etc.]

答え2

元の質問には、検索に再帰呼び出しは必要ありませんが、それがポイントだとは思いません。

私はあなたが望む方法でfindを再帰的に呼び出すことは不可能だと思います。

以下はどちらか(またはネストされた名前)を見つけるための再帰呼び出しではありませんが、最初の検索の結果セットを取得して2番目の検索に供給することはできませんか?本能的に私はそうするでしょう:

find `find ./ -maxdepth 1 -type d -name '.*'` \
    -maxdepth 1 -type f -name '*.ini' -exec md5sum {} \;

xargsを使用して2番目の検索を実行することもできます。

修正する:

ほとんどのUNIXユーティリティは1つではなく複数のファイル名引数を使用するため、通常は完全に回避できることを付け加えたいと思います-exec

md5sum `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`

\バックティックを入れ子にするときは、内部バックスラッシュの前にバックスラッシュを追加します。

md5sumファイル名パラメータのみが必要だと思われる場合は、いつでもforループでラップできます。

for f in `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`
do
    md5sum $f
done

-スペースで始まる場合、またはスペースを含むファイル/ディレクトリ名が含まれている場合、これはより困難になります。 UNIXユーティリティはこれらとうまく機能しません。この場合は、または引用符を追加する必要があります./--

明らかに、初期の例は次のようにすることができるので、良い例ではありません。

md5sum .*/*.ini

答え3

少なくとも私は2つのfindコマンドを入れ子にすることができました。

find ~ -maxdepth 1 -type d -name '.*' -execdir \
    find {} -maxdepth 1 -type f -name '*.ini' \;

しかし、そこから別の-exec(dir)-callを呼び出す問題は解決できませんでした。

関連情報