Command-Line使用
使用 -exec
和 xargs
時處理以破折號(“-”)開頭的文件名
儘管此處的某些文件名在文件名的開頭包含破折號,但我正在關注此問題。這被解釋為
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 的o
rdering 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
將返回帶有./
前綴的文件名。