Xargs
find + xargs:參數行太長
我有如下一行:
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 {} +