次のコマンドを実行するとき:
> 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
find
GNU( , 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