linux - xargs 如果文件存在则复制

标签 linux bash xargs cp

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

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

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

我该怎么做?

最佳答案

您需要向 xargs 提供 -i 标志,以便它用 {} 替换文件名。

但是,您似乎期望 xargs 提供给 cp,但它没有这样做。也许尝试类似的东西

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

(还要注意在 echo 中使用双引号。在极少数情况下,您需要一个没有引号的变量插值。)

要一次传入多个文件,可以在 sh -c 中使用 for 循环:

echo "$x" |
xargs sh -c 'for f; do
    test -f "$f" && continue
    echo "$f"
done' _ |
xargs cp --parents --target-directory=".,/folder/"

_ 参数是因为 sh -c 的第一个参数用于填充 $0,而不是 $@

关于linux - xargs 如果文件存在则复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16775098/

相关文章:

c - 这是linux内核代码中的任何一种宏吗?

linux - 匹配 bash case 语句中的字符串并查找当前无线网络

apache - Bash 脚本 : Wait for apache2 graceful-stop

linux - 为什么 find piped to xargs mv 删除了我的文件?

bash - 更改 xargs(或 GNU Parallel)参数中的文本

linux - Docker:无法运行存储在已安装卷中的 shell 脚本

linux - Openshift 每小时 cron 作业突然停止工作

bash - 当没有正在运行的 session 时,Tmux 无法连接到 `tmux ls` 上的服务器错误

linux - 我怎样才能在 linux 的命令中间用 xargs 传递所有参数

在没有 root 权限的情况下更改 Linux 中的网络设置