Xargs

find + xargs:參數行太長

  • March 8, 2018

我有如下一行:

find /foo/bar -name '*.mp4' -print0 | xargs -i {} -0 mv -t /some/path {}

但我收到以下錯誤:

xargs: argument line too long

我很困惑。是不是xargs應該精確地幫助解決這個問題?

**注意:**我知道我可以-exec在技術上使用 find,但我想了解上述失敗的原因,因為我的理解是xargs應該知道如何將輸入拆分為可管理的大小來執行的參數。這不是真的嗎?

這一切都與zsh有關。

一方面,-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 做這一切:

$ find /foot/bar/ -name '*.mp4' -exec mv -t /some/path {} +

引用自:https://unix.stackexchange.com/questions/83801