我得到了一個字符串,我想要複製的文件名。但是,只有其中一些文件存在。我現在的劇本是這樣的:xargs複製如果文件存在
echo $x | xargs -n 1 test -f {} && cp --target-directory=../folder/ --parents
不過,我總是得到test: {}: binary operator expected
錯誤。
我該怎麼做?
我得到了一個字符串,我想要複製的文件名。但是,只有其中一些文件存在。我現在的劇本是這樣的:xargs複製如果文件存在
echo $x | xargs -n 1 test -f {} && cp --target-directory=../folder/ --parents
不過,我總是得到test: {}: binary operator expected
錯誤。
我該怎麼做?
您需要將-i
標誌提供給xargs
,以便用{}
替換文件名。
但是,您似乎期望xargs
可以輸入cp
,但它不會。也許你可以試試
echo "$x" |
xargs -i sh -c 'test -f {} && cp --target-directory=../folder/ --parents {}'
(公告也與echo
使用雙引號的。還有,你要裸不帶引號的變量替換情形是很少見。)
xargs
只能運行一個簡單的命令。 &&
部分被shell解釋,這不是你想要的。只要創建與命令的臨時腳本要運行:
cat > script.sh
test -f "$1" && cp "$1" --target-directory=../folder/ --parents
控制-d
chmod u+x ./script.sh
echo $x | xargs -n1 ./script.sh
還要注意的是{}
不需要與-n1
因爲參數作爲硬道理在一條線上。
的最佳解決方案,謝謝。我想知道你爲什麼不使用「-n 1」參數。從我的想法來看,如果沒有它,xargs會一次放入多個參數,導致'test -f'無用。 – Zulakis
使用'-i'時,必須暗示'-n 1'。尤其是對於多個{}}佔位符,'xargs'不能一次傳入多個文件(或者指定許多可能行爲之一必須令人困惑的語法)。 – tripleee
好的,謝謝。我無法在'man xargs'中找到它:/ – Zulakis