「find -exec」を別の「find -exec」内にネストすることは可能ですか?


14

次のようなものは私が後だ何何ですが、私のコードは仕事、私は脱出どんなにしない{}+ ;

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

このUnix-&-Linuxの質問を見た後、次のコードが機能することがわかりましたが、それ自体はfindをネストしていません。

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シェルを呼び出す必要なしにネストする方法はありますか(上記を参照)、その奇抜な引用とエスケープの制約をすべて備えていますか?

または、これは、多くのパラメーターのブレンドを使用して、単一の検索コマンドで直接実行できますか?


4
あなたが求めていることを実行することは可能かもしれませんが、事態が複雑になると、シェルまたはPerlスクリプトに切り替えます。2番目のコードスニペットは、シェルスクリプトをインライン化するだけで、ほぼこれを実行しています。英雄的なワンライナーは面白いが、彼らは理解するのが難しく、したがって維持するのが難しい。これがあなたがどういうわけか上手くいくという一発的な取り引きでない限り、私は知的挑戦以外にそれをする正当な理由を見ることができません。
ウォーレンヤング

1
@Warrenヤング:私は確かにコンセプトが複雑であるとは思わないが、私はあなたがそこにはありません意味と仮定し、単純なとで行う方法がfind、しかし、もしfindこれを行うことはできません、なぜされるfindので、尊敬(?)ツール-としてファイルを見つけるために使用しますか?...私はfind ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+、私の状況ではうまく機能することが続いて見つかりました(jw013の参照-pruneはmanページでこれにつながっています)が、堅牢な方法(一般的に)かどうか疑問に思います。私が必要とするほとんどすべてのことを行ったfindように(Linuxの1年未満で)実際に使用したことはないlocateので、未知の領域です。
-Peter.O

1
-pathテストでは、私がお勧めするつもりだった正確に何です。これにより、必要なすべての操作を実行できるはずです(Ace Of Baseアソシエーションについてごめんなさい))
rozcietrzewiacz

回答:


8

次のような単一の検索を使用してみます。

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

ただし、md5sumを1回呼び出すだけで済むという利点は失われます。

編集

チェーンの一般的で安全な方法としてfind、次のようなことができます

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

私はエラーを取得する-f(?F)、およびとし、別のエラー-execdir..私は交換したとき-execdir -execで、および/または、プリントでのmd5sumを交換し、私は何を取得...
Peter.O

代わりにありがとう...しかし、私はこれを使用してこれを行う方法の後にもっといfindます...それは私がこの例を解決したいだけではありません.find-fuの方法に関する洞察を探しています..おそらく、fuに比べて毛羽立ちが多いかもしれません。(実際に使用したことがないので、わかりません)、これが(実際に画像ファイルに)使用したかった最初の状況です。私はあまり聞いたこと-exec機能を約ない全能の担当者などのように思える(?)暗示に...(代替のための1、しかし)..しかし、あなたのfind例では、単に仕事をしません(まだ)
Peter.O

findコマンドで次のエラーが発生します:... find: The relative path 〜/ bin 'はPATH環境変数に含まれていますが、これはfindの-execdirアクションと組み合わせて使用​​すると安全ではありません。そのエントリを$ PATHから削除してください。....多分それは機能しますが、私はしばらくの間その〜/ binを取り除こうとしていると言わなければなりません...それを真剣に見て...どこに設定したかわからない...どこに潜んでいるか考えている。~/bin私のPATH中
Peter.O

の力はfindグロブだけではできない状況で最も高く評価されると思いますが、そのような状況はまれなので、私は通常多くを見つける必要はありません。
jw013

さて、それは興味深い点です(グロブの使用について)...
Peter.O

2

元の問題では、再帰的にfindを呼び出す必要はありませんが、それはポイントではなかったと思います。

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

以下は、findを再帰的に(またはネストされた、呼び出されたものを)呼び出すこともありませんが、最初のfindの結果セットを取得して、2番目のfindにフィードすることはできませんか?これは私が本能的に行う方法です:

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

xargs2番目の検索の実行にも使用できます。

更新:

ほとんどのUNIXユーティリティは、1つではなく複数のファイル名引数を取るので、これを追加したかったので、通常は-exec完全に回避できます。

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

バックティックをネストする場合\、内側のバックスラッシュの前にバックスラッシュを追加するだけです。

md5sumファイル名の引数が1つだけであると考えられる場合、いつでもforループでラップできます。

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

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

明らかにできるのは、元の例が良い例ではないことです。

md5sum .*/*.ini

1
状況の概要をfind説明しましたが、ファイル/ディレクトリにスペースが含まれていると、示されているすべてのメソッドでエラーが発生します... md5sum .*/*.iniうまくいきます... * Warren Young's * findゲームの早い段階で「複雑」になっていることについてコメントします:)、しかしfind、条件テストがより複雑になると、それが独自になると思いますが、ネストする-execに関しては、私はかなりよく考えを落としました、それを行うにはもっと簡単な方法があるように思えます..(しかし、perlは私にとって(まだ)「単純」ではありません
...-Peter.O

0

少なくとも2つの検索コマンドをネストできました。

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

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


はい、それはまさに私の問題です:)
Peter.O

はい、ただし3をネストしないことは2をネストしないことと同じではありません。:)
ユーザー不明
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.