Bem, por um lado, a opção -i
está obsoleta:
-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.
Então, quando mudei o seu comando para isso, funcionou:
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
Exemplo
$ 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
...
Uso de -I{}
Essa abordagem não deve ser usada desde a execução desta construção de comando:
$ find -print0 ... | xargs -I{} -0 ...
ativa implicitamente esses comutadores para xargs
, -x
e -L 1
. O -L 1
configura xargs
para que esteja chamando os comandos para os quais deseja que os arquivos sejam executados de uma única maneira.
Portanto, isso anula o propósito de usar xargs
, já que, se você fornecer 1000 arquivos, o comando mv
será executado 1000 vezes.
Então qual abordagem devo usar então?
Você pode fazer isso usando xargs como este:
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
Ou apenas encontre tudo:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +