3

パイプとリダイレクトコマンドの本当の力を理解したい。私の理解で|は、1つのコマンド結果の出力をそれ自体の入力として受け取ります。そして、>それは出力のリダイレクトに役立ちます。そうであれば、

find . -name "*.swp" | rm 
find . -name "*.swp" > rm 

このコマンドが期待どおりに機能しない理由。上記のコマンドは、

  1. 現在のディレクトリで拡張子が.swpであるすべてのファイルを再帰的に検索します。
  2. の出力を取得し1. 、結果のファイルをすべて削除します。

参考までに、はい、私はこのタスクを実行する方法を知っています。-execフラグを渡すことで実行できます。

find . -name "*.swp"-exec rm -rf {} \;

しかし、すでに述べたように、私は>または|コマンドでそれを達成したいと思います。
私が間違っていて間違った方向に進んでいる場合は、私を訂正して、リダイレクトとパイプコマンドを説明してください。どこで誰のコマンドを使用しますか?私がすべてを読んだ簡単な本の例に言及しないでください。私にいくつかの複雑なことを説明してみてください。

4

4 に答える 4

4

これを、あなたが示した3つの方法で分類します。

  • >findからのすべての出力をという名前のファイルにリダイレクトしますrm(ファイルに追加しているだけなので、機能しません)。
  • |findからの出力をコマンドにパイプしますrm(読み取りが行われないため、rm機能しませんstdin
  • -exec rm -rf {} \;が見つかっrm -rfた各アイテム({})で実行されます(ファイルを引数として渡すため、機能します)。findrm

目的の動作を実現するためではなく、フラグを使用するか、コマンド()にパイプすることをお勧めします-execxargsman xargs|>

編集: @dmckeeが言ったように、$()文字列補間に演算子を使用することもできます。つまり、:(rm -rf $(find . -name "*.swp")引数の長さの制限により、ファイルの数が多い場合は失敗します)。

于 2012-09-12T18:48:15.387 に答える
3

>単にrmという名前のファイルにリダイレクトします。経由の配管| rmはSTDINを介したファイル名を予期しないため、tormは機能しません。したがって、STDINからの値を引数として渡すxargsを使用する必要があります。

find . -name "*.swp"|xargs rm

ファイル名にシェルがフィールドセパレータ($ IFS)と見なす文字が含まれている可能性があるため、これは危険です。したがって、次を使用します。

find . -name "*.swp" -print0|xargs -0 rm

これにより、ファイル名\ 0がSTDOUTに出力され、xargsがファイル名\ 0を分離して読み取り、それらを引数としてrmに渡します。

もちろん、これを達成する最も簡単な方法は次のとおりです。

rm **/*.swp

bashを使用すると仮定します。

于 2012-09-12T18:55:12.527 に答える
1

少し時間を取って、シェルリダイレクトの基本についてもう一度読んでください:)これは良いドキュメントだと思います:http ://wiki.bash-hackers.org/howto/redirection_tutorial

私はあなたにとって何が悪かったのかを説明しようとします:

find . -name "*.swp" | rm 

このコマンドは、検索結果、つまり検索結果をプログラムstdoutのにリダイレクトします。ただし、stdinでは読み取りません(これはのドキュメントで読み取ることができます)。ではなく、コマンドライン引数を介して制御されます。stdinから読み取る方法はまったくないと思います。そのため、何も削除されません。stdinrmrmrmrmstdinrm

find . -name "*.swp" > rm 

このコマンドは、改行で区切られた検索結果(検索のstdout)を「rm」というファイルにリダイレクトします。繰り返しますが、何も削除されません:)

基本的に<、、、、、、>演算子は>>、ファイルシステムに実際に存在するファイル&>との間で&>>リダイレクトを実行します。パイプは、あるコマンドからの標準出力を別のコマンドの標準入力にリダイレクトします。簡単に言えば、ここに関係するファイルはありません。ただし、このアプローチは、パイプの左側のプログラムが実際に何かを書き込み、パイプの右側のプログラムが読み取りを行い、両方のプログラムが相互に理解している場合、つまり読み取りプログラム(コンシューマー)が次の出力を理解している場合にのみ意味があります。給餌プログラム。|stdoutstdin

于 2012-09-12T18:48:34.030 に答える
0

リダイレクションはファイルを作成します。したがって、この例では、コマンドの出力が保存される>rmという名前のファイルを作成するだけです。./rm

パイプは本質的に省略形です。(明示的な)一時ファイルがないことを除けば、one | twoと同じです。one >tmp; two <tmp

もちろん、rm標準の入力からファイル名を読み取らないので、基本的には役に立ちません(パイプラインが、読み取らなかっcmd | rmた入力で何かを行うさらに別のコマンドを続行する状況を除いて)。rmそれが必要な場合は、がありxargsます。

find . -name "*.swp" | xargs rm 
于 2012-09-12T18:55:18.377 に答える