好吧,-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
命令,它从管道得到的参数进?(是否总是将它们放置在最后?)