26

次のようなファイルがあります

love.txt  
loveyou.txt 

ディレクトリ内useful。このファイルを directory にコピーします/tmp

私はこのコマンドを使用します:

find ./useful/ -name "love*" | xargs cp /tmp/

しかし、うまくいきません。

cp: target `./useful/loveyou.txt' is not a directory

このコマンドを使用すると:

 find ./useful/ -name "love*" | xargs -i cp {} /tmp/

それはうまく動作し、

2番目が機能する理由と、の使用法について詳しく知りたいです-i cp {}

4

6 に答える 6

21

xargs標準入力からの単語を、指定されたコマンドの引数リストの最後に置きます。したがって、最初のフォームは作成します

cp /tmp/ ./useful/love.txt ./useful/loveyou.txt

2つ以上の引数があり、最後の引数がディレクトリではないため、これは機能しません。

この-iオプションは、一度に 1 つのファイルを処理するように指示しますが、その名前にxargs置き換えます。{}

cp ./useful/love.txt    /tmp/
cp ./useful/loveyou.txt /tmp/

これは明らかにうまく機能します。

于 2013-08-07T13:30:13.817 に答える
11

xargs -iコマンドを使用する場合は、{}見つかった各要素に置き換えられます。したがって、あなたの場合、「loveyou.txt」と「love.txt」の両方に対して、次のコマンドが実行されます。

cp ./useful/loveyou.txt /tmp/
cp ./useful/love.txt /tmp/

を省略すると{}、見つかったすべての要素がコマンドの最後に自動的に挿入されるため、無意味なコマンドを実行することになります。

cp /tmp/ ./useful/loveyou.txt ./useful/love.txt
于 2013-08-07T13:30:19.677 に答える
4

最初の例はこれを行います:

cp /tmp/ love.txt loveyou.txt

/tmpディレクトリとファイルlove.txtをファイルにコピーしようとするため、これはできませんloveyou.txt

2 番目の例では、 のすべてのインスタンスを引数で置き換えるように-i指示しているため、次のようになります。xargs{}

cp love.txt /tmp/
cp loveyou.txt /tmp/
于 2013-08-07T13:30:19.273 に答える
4

xargs は、ストリームとして供給された値をコマンドの最後に追加します。入力値ごとにコマンドを 1 回実行するわけではありません。同じコマンドを複数回実行したい場合 - それが -i cp {} 構文の目的です。

これは、最後に引数のリストを受け入れるコマンド(grepなど)でうまく機能します-残念ながら、cpはそれらの1つではありません-渡す引数をコピー先のディレクトリと見なし、「ディレクトリではありません」エラーを説明します.

于 2013-08-07T13:30:20.650 に答える
3
find ./useful/ -name "love*" | xargs cp -t /tmp/
于 2015-08-11T19:17:09.797 に答える