-find / -name ".txt" -exec cp {} /junk \では、execの代わりにパイプを使用できます。

-find / -name ".txt" -exec cp {} /junk \では、execの代わりにパイプを使用できます。

/junk名前に.txtを含むファイルを見つけて、一致する各エントリをフォルダにコピーするには、次のコマンドを使用します。

find / -name ".txt" -exec cp {} /junk \;

-exec上記のコマンドの代わりにパイプを使用できますか?

パイプが同時に(パイプの各側)動作し、パイプが-exec左に最初に流れ、次に右に流れると言った人が覚えているようです。これは恋しいですか?パイプラインは、右側のコマンドに出力を提供する前に左側のコマンドから出力を取得する必要があるため、同時に実行できる方法がわかりません。

答え1

cpioこれには、コピーパススルーモードを使用できます。

find sourcedir -name "*.txt" | cpio -pd /junk

cpio標準入力からファイルのリストを取得し、コピーパススルーモードでファイルをターゲットディレクトリにコピーします。

答え2

findをxargsコマンドにパイプすることもできます。

- ヌードクリップhttp://www.unixmantra.com/2013/12/xargs-all-in-one-tutorial-guide.html

音楽フォルダ内のすべての.mp3ファイルを見つけてlsコマンドに渡します。ファイル名にスペースが含まれている場合は、-print0 が必要です。

   find ./music -name "*.mp3" -print0 | xargs -0 ls

作業フォルダ内のすべてのファイルを見つけてgrepに渡し、利益を検索します。

   find ./work -print | xargs grep "profit"

同時に、3つ以上のパラメータを受け入れるさまざまなコマンドで{}を使用する必要があります。たとえば、mvコマンドはファイル名を知る必要があります。次のコマンドは、現在のディレクトリ内または下にあるすべての.bakファイルを見つけて、~/.old.filesディレクトリに移動します。

find . -name "*.sh" -print0 | xargs -0 -I {} mv {} ~/back.scripts

{} の名前を別の名前に変更できます。次の例では、{}の名前がfileに変更されました。これは前の例よりも読みやすくなります。

find . -name "*.sh" -print0 | xargs -0 -I file mv file ~/back.scripts

どこ、

-0スペースまたは文字(改行を含む)がある場合、多くのコマンドは機能しません。このオプションは、スペースを含むファイル名を処理します。

-I 初期引数の置換-str の発生を標準入力から読み取った名前に置き換えます。また、引用符のないスペースは項目を終了せず、代わりに区切り文字は改行文字です。

関連情報