2

我得到了一个带有我要复制的文件名的字符串。但是,这些文件中只有一部分存在。我当前的脚本如下所示:

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

但是,我总是得到一个test: {}: binary operator expected错误。

我怎样才能做到这一点?

4

2 回答 2

6

您需要为其提供-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,而不是$@

于 2013-05-27T14:41:49.443 回答
1

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因为该参数用作一行的最后一个单词。

于 2013-05-27T14:40:07.830 回答