find -execで出力をパイプしてリダイレクトするための正しい場所は何ですか?

find -execで出力をパイプしてリダイレクトするための正しい場所は何ですか?

FreeBSDのコンソールでfindオプション-exec(例find . -exec sha1 {} \;:)を使用しています。

  1. > >>や&など、execコマンドまたはfindコマンドに構文的に適用されるリダイレクトやその他の実行制御シンボルを正しく配置するにはどうすればよいですか? |それ以外の場合、find私はコマンドがありますか?exec

  2. 同じトピックで、teeコンソールでview-execコマンドの出力を使用して(進行状況を観察するために)ファイルに追加する(後で使用するために)構文は何ですか?

(シェルが多様であることを知っていますが、最も一般的に使用されるシェル(例:sh / csh)は非常に似ていると思いますか?)

修正する:

find -execある時点で、スクリプトなしで簡単なコマンドでネストを実行できるかどうかを知りたいです。問題を引き起こすユースケースは次のとおりです。

  • 外部find: DIR_MATCH_TEXT に一致するすべてのサブディレクトリを検索します。DIR1
  • inside find: 外部ループ (DIR2 と呼ばれる) で見つかった一致する各サブディレクトリに対して次のコマンドを実行します。
    find DIR2 -name "FILE_MATCH_TEXT" -exec sha1 {} \; >> DIR1/DIR2_hashes.txt

find -exec目的は、そのサブディレクトリへの一部のジョブの出力を含む一致するサブディレクトリにそれぞれ対応するファイルセットを作成することです。

つまり、およびを/backups含めると、結果は、すべての.pdfファイルの出力と、すべての.pdfファイルの出力を含む2つのファイルになるということです。/jan2017/feb2017/backups/jan2017_hashes.txt/backups/feb2017_hashes.txtjan2017_hashes.txtsha1/backups/jan2017feb2017_hashes.txtsha1/backups/feb2017

これまでの答えを見ると、 ? への引数としてfindシェルを使って外部を呼び出す必要があると思います。-exec

ベストアンサー1

I / Oリダイレクトとパイプはbashなどのシェルの機能です。findコマンドのソースコードを見る(https://www.gnu.org/software/findutils/)、この-execオプションは与えられたコマンドを直接分岐して実行し、シェルを介して転送しません。したがって、.without helpパラメータにパイプとリダイレクトを含めることはできませんfind

ただし、findシェルを呼び出し、シェルに順番にコマンドを呼び出すことができます。シェルを介して同じタスクを実行すると、シェルが提供するI / Oリダイレクトタスクにアクセスできます。たとえば、次のことを考えてみましょう。

find . -type f -exec bash -c 'ls -l "$1" >> /tmp/result' find-sh {} \;

ls -lで見つかった各ファイル(このコンテキストでは、シェルはファイルを参照)で実行され、出力をにリダイレクトします。ここでは、 find が各ファイルに対してシェルを呼び出すので、各結果が前の結果を上書きし、最後のコマンドの出力のみを含むファイルが生成されます。find$0/tmp/result>>>>

パイプも動作しますが、「ファイルごとに1つのランチャー」という同じ警告があります。

find . -type f -exec bash -c 'ls -l "$1" | grep something' find-sh {} \;

それにもかかわらず、 のコンテキストでリダイレクトを適用する理由や-execfind 自体の出力に対してリダイレクトを行うと、何が得られるかは明らかではありません。

おすすめ記事