2013-05-27 69 views
0

我得到了一個字符串,我想要複製的文件名。但是,只有其中一些文件存在。我現在的劇本是這樣的:xargs複製如果文件存在

echo $x | xargs -n 1 test -f {} && cp --target-directory=../folder/ --parents 

不過,我總是得到test: {}: binary operator expected錯誤。

我該怎麼做?

回答

3

您需要將-i標誌提供給xargs,以便用{}替換文件名。

但是,您似乎期望xargs可以輸入cp,但它不會。也許你可以試試

echo "$x" | 
xargs -i sh -c 'test -f {} && cp --target-directory=../folder/ --parents {}' 

(公告也與echo使用雙引號的。還有,你要裸不帶引號的變量替換情形是很少見。)

+0

的最佳解決方案,謝謝。我想知道你爲什麼不使用「-n 1」參數。從我的想法來看,如果沒有它,xargs會一次放入多個參數,導致'test -f'無用。 – Zulakis

+0

使用'-i'時,必須暗示'-n 1'。尤其是對於多個{}}佔位符,'xargs'不能一次傳入多個文件(或者指定許多可能行爲之一必須令人困惑的語法)。 – tripleee

+0

好的,謝謝。我無法在'man xargs'中找到它:/ – Zulakis

2

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因爲參數作爲硬道理在一條線上。

相關問題