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

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

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

> 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を使用しています

修正する:

アップデート1:

私は試した:

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

しかし、次のような数行が表示されます。

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

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

アップデート2:

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

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

良い結果。-tそれを使うときになぜ必要ですかxargs

答え1

findGNU( , xargs, & ) があるとし、mvコマンドを次のように変更します。

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

から抜粋mvマニュアルページ

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

上記のコマンドxargs ...は、move呼び出しが次のように構成されています。

 $ 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

引用する

答え2

find コマンドの代わりに ls コマンドを使用することもできます。

ls /foot/bar/*.csv | xargs  mv -t some_dir

関連情報