Po pierwsze, -i
przełącznik jest przestarzały:
-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.
Kiedy zmieniłem twoje polecenie na to, zadziałało:
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
Przykład
$ 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
...
Zastosowanie -I{}
Nie należy stosować tego podejścia, ponieważ uruchomiono następującą konstrukcję polecenia:
$ find -print0 ... | xargs -I{} -0 ...
niejawnie włącza się do tych przełączników xargs
, -x
a -L 1
. W -L 1
konfiguruje xargs
tak, że dzwoni polecenia chcesz go uruchomić poprzez pliki w jednym modzie.
To przeczy celowi użycia xargs
tutaj, ponieważ jeśli dasz mu 1000 plików, uruchomi to mv
polecenie 1000 razy.
Więc jakiego podejścia powinienem użyć?
Możesz to zrobić za pomocą xargs:
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
Lub po prostu znajdź to wszystko:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +
"This approach shouldn't be used"
które podejście należy zastosować? Czy"find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir'"
byłoby lepszym rozwiązaniem? Jeśli tak, to w jaki sposób będziexargs
wiedzieć w tym przypadku, gdy wmv
komendzie do paszy w argumentach, że dostaje od rury? (czy zawsze umieszcza je na końcu?)