我得到了一个带有我要复制的文件名的字符串。但是,这些文件中只有一部分存在。我当前的脚本如下所示:
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
。在极少数情况下您需要一个未加引号的变量插值。)
要一次传入多个文件,您可以for
在以下代码中使用循环sh -c
:
echo "$x" |
xargs sh -c 'for f; do
test -f "$f" && continue
echo "$f"
done' _ |
xargs cp --parents --target-directory=".,/folder/"
该_
参数是因为第一个参数 tosh -c
用于填充$0
,而不是$@
xargs
只能运行一个简单的命令。该&&
部分由外壳解释,这不是您想要的。只需使用您要运行的命令创建一个临时脚本:
cat > script.sh
test -f "$1" && cp "$1" --target-directory=../folder/ --parents
Control-D
chmod u+x ./script.sh
echo $x | xargs -n1 ./script.sh
另请注意,这{}
不是必需的,-n1
因为该参数用作一行的最后一个单词。