【问题标题】:Why is my find and xargs copy command working for one folder and not for the other?为什么我的 find 和 xargs 复制命令适用于一个文件夹而不适用于另一个文件夹?
【发布时间】:2020-01-25 10:01:25
【问题描述】:

我有两个目录,x86_64i386。 我想从这两个文件夹中过滤掉测试 RPMS 并将它们放在一个单独的文件夹中;分别为test_release/{version}-x86_64/x86_64test_release/{version}-i386/i386

所以我的第一个命令运行良好:

find x86_64/ -type f -name '*test*' -o -name '*demo*' -o -name '*log*' |
xargs cp -rt test_release/${RELEASE}-x86_64/x86_64

我的第二个命令完全相同,只是文件夹名称不同:

find i386/ -type f -name '*test*' -o -name '*demo*' -o -name '*log*' |
xargs cp -rt test_release/${RELEASE}-i386/i386

只有第二个命令给了我错误:

cp: missing file operand

我错过了什么吗?

【问题讨论】:

  • 可能不相关,但您的查找命令将选择与*demo**log* 匹配的文件夹 以及文件
  • 如果您单独运行它,即没有 xargs,第二个命令中的 find 是否会给您一个输出?
  • @Pacifist 不,它没有给我输出。显然它找不到文件夹 i386?当我对 x86 文件夹执行相同操作时,它确实给了我输出。
  • @oguzismail 我认为通过指定 -type f 标志它只会给我文件?
  • 这就是问题所在。 cp <source> <target> ,它缺少源。第一个命令也是如此,因为那里没有丢失源代码。

标签: bash unix find xargs


【解决方案1】:

发生错误是因为您的 find 命令没有返回任何文件。令人失望的是,xargs 仍然运行cp,但最终以太少的参数调用它;所以你会收到错误消息。

GNU xargs 有一个 -r 选项可以解决这种特殊情况;但更便携、更健壮的解决方案是使用find -exec

find i386/ -type f -name '*test*' -o -name '*demo*' -o -name '*log*' \
    -exec cp -rt "test_release/${RELEASE}-i386/i386" {} +

-exec+ 语句终止符不是完全可移植的,但如果你有 cp -t 我猜你在 Linux 上,或者至少正在使用最近的 find(GNU 或不是 GNU。如果不是,用\; 替换+ 是一种解决方法,尽管它最终会运行比等效的xargs 构造更多的进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多