「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
。
- xargsと直接実行の結果が異なるのはなぜですか
find
? - 外見は
-exec
前に来ることはできません-name
。そうですか? - 最後に要点:
find
結果を互いに正しく実行する方法はfind
?
システム:Linux Mint 19.2
2番目の質問を明確にするためにコメントの後に追加されました。
走れば
find "path" -name foundfilename -exec ls -l {} \;
期待どおりに見つかり、リストされた複数のファイルの出力ls
、つまり2番目の質問を取得します。
.1
2
/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
実行するかどうかが決まります。したがって、ls
iffを正常に実行すると、成功した-name
内容が印刷されます。-name
find
他の結果を正しく実行するにはfind
?
他find
の中で実行することができます。たとえば、次のディレクトリですべてのシンボリックリンクを見つけます。-exec
find
lib
find / -type d -name lib -exec find {} -type l \;
/lib/
/var/lib/
などの結果が得られます。/usr/lib/
いくつかの質問があります:
- これは
find
外部の結果に基づいて内部を実行しますfind
。 1つの結果のすべての結果を一度に使用するにはfind
、つまり次のようにします。一つ他のfind
。 - 内部
find
も実行する必要がある場合は、(として入力)またはを-exec
渡す直接的な方法はありません。これは外部から解釈されるためです。 1つの解決策は以下を使用することです。{}
;
\;
+
find
xargs
素晴らしい)、通常は改行を含む名前に失敗しないようにPOSIX以外のオプションが必要です。別の解決策は、find
2つのsの間にシェルを作成することです(例:この他の答え私の記事の作成中にこの問題が発生しました。その回避策を繰り返さないでください。)
「別の引数だけでなく、コマンド引数のどこにでも表示されます」が何を意味するのかわかりません。
POSIXfind
延長が必要ホロ {}
。{}.txt
「これらの2つの文字が置き換えられるか、文字列が変更されずに使用されるかは実装によって定義されます」foo{}bar
などのパラメータの場合。find
あなたのバージョンはまたは同じ引数find
に置き換えられ、{}
マニュアルにはこれについて明確に記載されています。{}.txt
foo{}bar