zsh: argument list too long: mv

Posted in :

很奇怪,之前都沒有這個問題,發生的原因是因為同一時間在處理大量的檔案所造成。

例如,同一個目錄下有大量的 svg 檔案,想把檔案移到 backup 目錄下,使用指令:

mv *.svg backup

居然顯示錯誤,解法:

find . -name "*.svg" -exec mv {} backup \;

同理,如果需要使用 rm 指令,改服用:

find . -name "*.svg" -exec rm {} \;

要拷貝目前資夾下以jpg結尾的文件到backup目錄。

解法1為:

find . -name "*.jpg" | xargs -i cp {} backup

解法2為:

find . -name "*.jpg" -exec cp {} backup \;

上面的解法1 在 macOS 裡會有問題,建議使用解法2 在 linux / mac 上都通用。

其它 cp 、 rm 的指令也會有 Argument list too long 的問題,也可以用類似上述方式解決。

-exec參數後面是指執行其後面的命令,-exec以;為結尾,由於各個系統中分號的意義不同,因此用\進行轉義,即\;,{}會被find命令的結果替換。


上面的指令,過二天就忘了,真的很麻煩,改用 shell script 來解決:

xcp.sh

!/bin/bash
find . -maxdepth 1 -name "${1}" -exec cp {} ${2} \;

xrm.sh

!/bin/bash
find . -maxdepth 1 -name "${1}" -exec rm {} ${2} \;

xmv.sh

!/bin/bash
find . -maxdepth 1 -name "${1}" -exec mv {} ${2} \;

再把上面的 shell script copy 到 /usr/local/bin 裡,就可以隨時地使用。

-maxdepth 1是因為 find 預設就會進去subfolder, 這實在很令人困擾!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *