検索で検索を実行

検索で検索を実行

「linux run find on find」のウェブ検索を行いましたが、関連する検索結果は表示されませんでした。検索でファイルのリストを作成し、そのリストから検索を再実行したいと思います。

いくつかの「愚かな」バグを修正した後、コマンドラインの作業経験がほとんどなかったので、最終的なコマンドは次のようになりました。

find "path1" -size 0 -printf "%f\0" | xargs -0 --max-args=1 --verbose find "path2" -exec ls -l {} \\\; -name

As --verbose、コマンドが次のように実行されるのを見ます。

find path -exec ls -l {} \; -name foundfilename

そして出力missing argument to exec

結果コマンドbuildを直接実行するとxargs(何らかの理由で二重引用符xargs --verboseを追加すると出力がありませんが、実際にはfindにスペースが含まれているパスに問題がないため実際に動作します)

find "path" -exec ls -l {} \; -name foundfilename

出力は次のとおりですpath

  1. xargsと直接実行の結果が異なるのはなぜですかfind
  2. 外見は-exec前に来ることはできません-name。そうですか?
  3. 最後に要点:find結果を互いに正しく実行する方法はfind

システム:Linux Mint 19.2

2番目の質問を明確にするためにコメントの後に追加されました。

走れば

find "path" -name foundfilename -exec ls -l {} \;

期待どおりに見つかり、リストされた複数のファイルの出力ls、つまり2番目の質問を取得します。

.12/media/ramdrive

marina@tpx:~$ find /media/ramdrive -exec ls {} \; -name 1
1  2
/media/ramdrive/2
/media/ramdrive/1
marina@tpx:~$ find /media/ramdrive -name 1 -exec ls {} \;
/media/ramdrive/1

その男は以下を発見した。

-コマンドを実行します。コマンドを実行します。状態 0 が返されると true です。 findの次の引数は、;' is encountered. The string {} 'で構成された引数が、一部のバージョンのfindと同様に、別の引数ではなく、コマンドの引数に現れる現在のファイル名に置き換えられるまで、コマンドの引数として扱われます。どちらの構成も、シェル拡張から保護するためにエスケープ(「使用」)または引用符を付ける必要があります。 -exec オプションの使用例については、「例」セクションを参照してください。一致するファイルごとに指定されたコマンドが一度実行されます。このコマンドは起動ディレクトリで実行されます。 -execジョブを使用すると回避できないセキュリティ上の問題があるため、-execdirオプションを使用する必要があります。

-execなぜ一致オプションの前に存在できないのかわかりません。

実際には、「別の引数だけでなく、コマンド引数のどこにも現れます」が何を意味するのか理解していません。

2つを追加します。
それでも解決策が見つかりました。

find "path1" -size 0 -printf "%f\0" | xargs -0 --max-args=1 --verbose find "path2" -name | xargs ls -l

ただし、findのデフォルト印刷は結果を引用しないため、空白のあるパスでは失敗します。引用符を追加するユーティリティはありますか?

ベストアンサー1

なぜxargs直接find操作と結果が異なるのですか?

タイプ find path -exec ls -l {} \; -name foundfilenameシェルはシェルを\;;コマンドに渡される」と発音します。ただ;入力するとコマンド区切り記号になります。バックスラッシュはシェルによって「食べられ」、それに応じて動作が変更されます;

いつxargs言ったの?走る find path -exec ls -l {} \; -name foundfilename、バックスラッシュを削除するために実際にはシェルなしでコマンドに渡されます\;(つまり、に渡されます)。findしたがって、\;エラーは次のようになります。 orを-exec期待すると、どちらも得られないため、「execの引数がありません」。;+


外見は-exec前に来ることはできません-name。そうですか?

間違っています。それができます。ないかもしれません。必要な操作によって異なります。両方のコマンドの異なる結果は簡単に説明されます。これら2つのコマンドは次のとおりです。

find /media/ramdrive -exec ls {} \; -name 1
find /media/ramdrive -name 1 -exec ls {} \;

重要な事実:

  • -execそれもテストです。内部コマンドが返された場合にのみ成功します0
  • -oテストは(論理OR)または-a(論理AND)演算子にリンクされます。-aあなたの場合のように演算子が欠落しているとします。
  • -test1 -o -test2またはを使用-test1 -a -test2して-test1最初にテストしてください。結果がそれだけで決まると-test1実行され-test2ません。特に、これは-test1 -a -test2成功した場合にのみ実行されることを意味します(私たちはすでに結果を知っているので、失敗した場合は必要ありません:失敗)。test2-test1-test2

フルテストが-exec ls {} \; -name 1(たとえば-exec ls {} \; -a -name 1)の場合は、-exec各候補をテストしてください。これはすでに標準出力で何かを印刷します。成功した候補ごとにls異なるテストが実行されますが、他のテストでは何も印刷されず、追加のテスト/タスクがないため重要ではありません(デフォルトは-print以前によって抑制されます-exec)。

フルテストが-name 1 -exec ls {} \;(たとえば-name 1 -a -exec ls {} \;)の場合は、-name各候補をテストしてください。テストは何も印刷しませんが、結果に基づいて-exec実行するかどうかが決まります。したがって、lsiffを正常に実行すると、成功した-name内容が印刷されます。-name


find他の結果を正しく実行するにはfind

findの中で実行することができます。たとえば、次のディレクトリですべてのシンボリックリンクを見つけます。-execfindlib

find / -type d -name lib -exec find {} -type l \;

/lib//var/lib/などの結果が得られます。/usr/lib/

いくつかの質問があります:

  • これはfind外部の結果に基づいて内部を実行しますfind。 1つの結果のすべての結果を一度に使用するにはfind、つまり次のようにします。一つ他のfind
  • 内部findも実行する必要がある場合は、(として入力)またはを-exec渡す直接的な方法はありません。これは外部から解釈されるためです。 1つの解決策は以下を使用することです。{};\;+findxargs素晴らしい)、通常は改行を含む名前に失敗しないようにPOSIX以外のオプションが必要です。別の解決策は、find2つのsの間にシェルを作成することです(例:この他の答え私の記事の作成中にこの問題が発生しました。その回避策を繰り返さないでください。)

「別の引数だけでなく、コマンド引数のどこにでも表示されます」が何を意味するのかわかりません。

POSIXfind延長が必要ホロ {}{}.txt「これらの2つの文字が置き換えられるか、文字列が変更されずに使用されるかは実装によって定義されます」foo{}barなどのパラメータの場合。findあなたのバージョンはまたは同じ引数findに置き換えられ、{}マニュアルにはこれについて明確に記載されています。{}.txtfoo{}bar

おすすめ記事