他の「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.]

おすすめ記事