find + xargsでファイルを移動する:ターゲットはディレクトリではありませんか?


9

次のコマンドを実行すると:

> mkdir some_dir
> find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} some_dir

次のような数百行が表示されます。

mv: target `/foo/bar/XX.csv` is not a directory

どうして?xargsが実行されると思った:

mv /foo/barXX.csv some_dir

find見つかったすべてのファイルに対して。どうしたの?ちなみにこれはzshで

更新:

Update1:

私は試した:

find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} -t some_dir

しかし、私は次のような数行を得ました:

mv: cannot stat `{}': No such file or directory

コマンドは私のファイルを正しく移動していると思いますが。

Update2:

単独で-t使用する場合、オプションは必要ないようですmv。例えば

> touch file1.txt
> touch file2.txt
> mkdir my_dir
> mv  file1.txt  file2.txt  my_dir

うまくいきます。なぜ-t使用する必要があるのxargsですか?

回答:


14

あなたがGNUを(持っていると仮定するとfindxargsmv)、これにあなたのコマンドを変更します。

$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir

manページからの抜粋mv

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

上記xargs ...はコマンドを作成するので、移動の呼び出しは次のようになります。

 $ mv 1.csv 2.csv 3.csv ... -t some_dir

xargsは不要

findすべての作業を行うだけで、このアプローチをスキップできます。

$ find /foot/bar/ -name '*.csv' -exec mv -t some_dir {} +

なぜあなたは必要mv -t ...ですか?

これは、xargs毎回実行するコマンド(つまりmv ...)に渡すファイルのセットを構築する方法に関係しています。

mvコマンドを手動で実行する場合、それに渡されるファイル名の数を制御します。そのため-t my_dir、宛先ディレクトリを常に最後に置くので、必要になることを心配する必要はありません。

参考文献


ありがとう!これは非常に役立ちます。私は少し混乱しています(私のアップデートを参照)
Amelio Vazquez-Reina

1
構築されたコマンドはmv -t some_dir 1.csv 2.csv 3.csv ...、ファイル引数が最後になるようになっています。それは使用するためには、問題のエラーだ{}あなたは合格しなければならない-I {}xargs
frostschutz 2013

ありがとう。それがすべてを説明しています。Update 2の2つ目の質問についてはどうですか?-t複数のファイルと通常のディレクトリが必要ない理由を知っていますmvか?
Amelio Vazquez-Reina

1
@ user815423426-今夜機会があれば更新します。理由はわかります。
slm

@ user815423426-質問を更新しましたmv -t。意味がわかれば教えてください。
slm

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.