Eh bien, pour une chose, le -i
commutateur est obsolète:
-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.
Donc, quand j'ai changé votre commande en cela, cela a fonctionné:
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
Exemple
$ 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
...
Utilisation de -I{}
Cette approche ne doit pas être utilisée depuis l'exécution de cette construction de commande:
$ find -print0 ... | xargs -I{} -0 ...
active implicitement ces commutateurs vers xargs
, -x
et -L 1
. Le -L 1
configure xargs
pour qu'il appelle les commandes que vous souhaitez qu'il exécute les fichiers d'une seule manière.
Donc, cela va à l'encontre du but de l'utilisation xargs
ici, car si vous lui donnez 1000 fichiers, il va exécuter la mv
commande 1000 fois.
Alors, quelle approche dois-je utiliser alors?
Vous pouvez le faire en utilisant des xargs comme celui-ci:
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
Ou tout simplement trouver trouver tout faire:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +
"This approach shouldn't be used"
quelle approche utiliser à la place? Serait"find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir'"
une meilleure solution? Si oui, comment nexargs
sait dans ce cas où lamv
commande à l' alimentation dans les arguments qu'il obtient de la conduite? (les place-t-il toujours en dernier?)