我得到了一个字符串,我想要复制的文件名。但是,只有其中一些文件存在。我现在的剧本是这样的: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