Ну, с одной стороны, -i
переключатель не рекомендуется:
-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.
Поэтому, когда я изменил вашу команду на это, это сработало:
$ find /foo/bar -name '*.mp4' -print0 | xargs -I{} -0 mv -t /some/path {}
пример
$ 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
...
Использование -I{}
Этот подход не должен использоваться после запуска этой команды:
$ find -print0 ... | xargs -I{} -0 ...
неявно включает эти переключатели в xargs
, -x
и -L 1
. В -L 1
конфигурирует xargs
так , что он звонит команды , которые вы хотите запустить файлы через в одной моде.
Таким образом, это лишает смысла использование xargs
здесь, поскольку, если вы дадите ему 1000 файлов, он будет запускать mv
команду 1000 раз.
Так какой подход я должен использовать тогда?
Вы можете сделать это, используя xargs вот так:
$ find /foot/bar/ -name '*.mp4' -print0 | xargs -0 mv -t /some/path
Или просто найти сделать все это:
$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +
"This approach shouldn't be used"
какой подход следует использовать вместо этого? Было"find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir'"
бы лучшим решением? Если да, то как жеxargs
знать в этом случае , когда вmv
команде кормиться аргументов он получает из трубы? (это всегда ставит их в последний раз?)