Command-Line

使用 -execxargs 時處理以破折號(“-”)開頭的文件名

  • October 3, 2019

儘管此處的某些文件名在文件名的開頭包含破折號,但我正在關注此問題。這被解釋為cp.

另一個問題(關於ServerFault)之後,我嘗試將命令更改為:

shuf -zn8 -e *.jpg | xargs -0 cp -vt -- {} target/ 

或者

shuf -zn8 -e *.jpg -exec cp -vt -- {} target/

無濟於事。我如何處理-文件名的開頭?

-t選項(一個 GNU 擴展)接受一個參數,即目標目錄。

使用xargs -0 cp -vt -- target/, 將嘗試將target/所選文件複製到名為 的目錄--中,並且您仍然不會標記選項的結尾。您還需要標記選項的結束shuf

{}僅與find-exec謂詞或與 ’ 謂詞相比是特殊的,xargs如果你使用-I'{}',但你在這裡不需要它。shuf沒有-exec謂詞。

在這裡,你會想要:

shuf -zen8 -- *.jpg | xargs -r0 cp -vt target --

或者

shuf -zen8 ./*.jpg | xargs -r0 cp -vt target

使用zsh,您還可以使用其e基於 xpression 的ordering glob 限定符:

cp -v -- *.jpg(oe['REPLY=$RANDOM'][1,8]) target/

shuf與在任何系統上工作的方法相比,這具有優勢(前提zsh是已安裝;您可能需要放棄-v某些系統上的非標準)並且即使jpg目前目錄中有兩個很多文件(和執行shuf將失敗並出現太多參數錯誤)。

看起來它shuf不是cp以破折號開頭的文件名。嘗試在shuf命令中添加雙破折號:

shuf -zn8 -e -- *.jpg | xargs -0I{} cp -vt -- "{}" target/ 

我會用find這個,而不是shuf

find . -type f -name '*.jpg' -print0 | xargs -0I{} cp "{}" target/

cp在這種情況下,您也不需要雙破折號,因為find將返回帶有./前綴的文件名。

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