Bueno, por un lado, el -i
interruptor está en desuso:
-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.
Entonces, cuando cambié su comando a esto, funcionó:
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
Ejemplo
$ 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{}
Este enfoque no debe usarse desde que se ejecuta esta construcción de comando:
$ find -print0 ... | xargs -I{} -0 ...
implícitamente activa estos interruptores a xargs
, -x
y -L 1
. La -L 1
configura xargs
para que llame a los comandos que desea que ejecuten los archivos de una sola manera.
Entonces esto anula el propósito de usar xargs
aquí ya que si le das 1000 archivos, ejecutará el mv
comando 1000 veces.
Entonces, ¿qué enfoque debo usar?
Puedes hacerlo usando xargs como este:
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
O simplemente haz que find lo haga todo:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +
"This approach shouldn't be used"
qué enfoque debería usarse en su lugar? ¿"find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir'"
Sería una mejor solución? Si es así, ¿cómo noxargs
saber en este caso en el que en elmv
comando para la alimentación de los argumentos que recibe de la tubería? (¿siempre los coloca al final?)