2013-05-27 27 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因为参数作为硬道理在一条线上。