Bene per prima cosa lo -i
switch è deprecato:
-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.
Quindi quando ho cambiato il tuo comando in questo, ha funzionato:
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
Esempio
$ 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 di -I{}
Questo approccio non deve essere utilizzato dall'esecuzione di questo costrutto di comando:
$ find -print0 ... | xargs -I{} -0 ...
trasforma implicitamente questi interruttori a xargs
, -x
e -L 1
. Si -L 1
configura in xargs
modo tale da chiamare i comandi per cui si desidera eseguire i file in un unico modo.
Quindi questo sconfigge lo scopo di usare xargs
qui poiché se gli dai 1000 file eseguirà il mv
comando 1000 volte.
Quindi quale approccio dovrei usare allora?
Puoi farlo usando xargs in questo modo:
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
O devi solo trovare fare tutto:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +
"This approach shouldn't be used"
quale approccio dovrebbe essere usato invece? Sarebbe"find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir'"
una soluzione migliore? In tal caso, come fa axargs
sapere in questo caso dove nelmv
comando inserire gli argomenti che ottiene dalla pipe? (li posiziona sempre per ultimi?)