次の行があります。
find /foo/bar -name '*.mp4' -print0 | xargs -i {} -0 mv -t /some/path {}
ただし、次のエラーが発生します。
xargs: argument line too long
混乱しています。 Shouldを使用すると、xargs
この問題を解決するのに役立ちますか?
メモ:技術的にはfindを使用できることを知っていますが、-exec
上記の方法が失敗した理由を知りたいです。xargs
これは、入力をジョブパラメータに合わせて管理可能なサイズに分割する方法を知る必要があるためです。これは本当ではないか?
それはすべてzshについてです。
ベストアンサー1
まず、この-i
スイッチは廃止されました。
-i[replace-str]
This option is a synonym for -Ireplace-str if replace-str is specified.
If the replace-str argument is missing, the effect is the same as -I{}.
This option is deprecated; use -I instead.
だから、あなたのコマンドをこれに変更したときに動作しました。
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
はい
$ find . -print0 | xargs -I{} -0 echo {}
.
./.sshmenu
./The GIT version control system.html
./.vim_SO
./.vim_SO/README.txt
./.vim_SO/.git
./.vim_SO/.git/objects
./.vim_SO/.git/objects/pack
./.vim_SO/.git/objects/pack/pack-42dbf7fe4a9b431a51da817ebf58cf69f5b7117b.idx
./.vim_SO/.git/objects/pack/pack-42dbf7fe4a9b431a51da817ebf58cf69f5b7117b.pack
./.vim_SO/.git/objects/info
./.vim_SO/.git/refs
./.vim_SO/.git/refs/tags
...
使用-I{}
このコマンド構成を実行した後は、この方法を使用しないでください。
$ find -print0 ... | xargs -I{} -0 ...
xargs
、-x
および に対してこれらのスイッチを暗黙的にオンにします-L 1
。単一の方法でファイルを実行したいコマンドを呼び出すように設定します-L 1
。xargs
xargs
したがって、1000個のファイルを提供すると、mv
コマンドが1000回実行されるため、ここで使用する目的は失われます。
それでは、どのような方法を使うべきですか?
次のように xargs を使用してこれを行うことができます。
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
または、ちょうどすべてを探してください:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +