当前位置: 首页 > 面试题库 >

为什么find -exec mv {} ./target/ +不起作用?

苏波涛
2023-03-14
问题内容

我想知道到底是什么{} \;{} \+| xargs ...做的。请通过解释进行澄清。

下面的3条命令运行并输出相同的结果,但是第一个命令花费一些时间,格式也几乎没有什么不同。

find . -type f -exec file {} \;
find . -type f -exec file {} \+
find . -type f | xargs file

这是因为第1个file命令针对来自该find命令的每个文件运行该命令。因此,基本上它的运行方式为:

file file1.txt
file file2.txt

但是后2个-exec命令查找命令对所有文件运行一次file命令,如下所示:

file file1.txt file2.txt

然后,我运行以下命令,第一个在没有问题的情况下运行,但第二个给出错误消息。

find . -type f -iname '*.cpp' -exec mv {} ./test/ \;
find . -type f -iname '*.cpp' -exec mv {} ./test/ \+ #gives error:find: missing argument to `-exec'

对于带有的命令{} \+,它会给我错误消息

find: missing argument to `-exec'

这是为什么?谁能解释我在做什么错?


问题答案:

该手册(或在线GNU手册)几乎说明了一切。

找到-exec命令{} \;

对于每个结果,command {}都会执行。出现的所有内容{}均替换为文件名。;以斜杠为前缀,以防止外壳解释它。

查找-exec命令{} +

每个结果都将附加command并执行。考虑到命令长度的限制,我猜想该命令可能会执行更多次,其中手册页支持我:

该命令的调用总数将远远少于匹配文件的数目。

请注意手册页中的以下引用:

命令行的构建与xargs构建命令行的方式几乎相同

这就是为什么在空格之间{}以及+除空格之外都不允许使用任何字符的原因。+make find检测到应将参数附加到命令,就像xargs

解决方案

幸运的是,的GNU实现mv可以接受目标目录作为参数,可以使用-t或较长的parameter --target。它的用法将是:

mv -t target file1 file2 ...

您的find命令将变为:

find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+

从手册页:

-exec命令;

执行命令;如果返回0状态,则为true。以下所有要查找的参数都将被视为命令的参数,直到由’;’组成的参数为止 遇到。字符串
{}”将替换为在命令参数中出现的所有处所正在处理的当前文件名,而不是仅在单独存在的参数中(如在某些版本的find中)。这两种构造都可能需要转义(以’'表示)或加引号,以防止它们被外壳扩展。有关使用-
exec选项的示例,请参见示例部分。对于每个匹配的文件,指定的命令运行一次。该命令在起始目录中执行。-exec操作的使用不可避免地存在安全问题;您应该改用-
execdir选项。


-exec命令{} +

-exec操作的此变体在选定的文件上运行指定的命令,但是通过在末尾附加每个选定的文件名来构建命令行。该命令的调用总数将远远少于匹配文件的数目。命令行的构建与xargs构建命令行的方式几乎相同。该命令内仅允许一个{{}”实例。该命令在起始目录中执行。



 类似资料:
  • 问题内容: 我正在尝试从JSON网址获取集合。骨干网确实发送了请求并得到了响应,但是在它之后的集合中没有: 这是我的JavaScript: 响应中的JSON 响应中的Content-Type HTTP标头为。 为什么不将其加载到集合中?JSON是否正确? 一些更多的代码: 问题答案: 是异步的。尝试 要么 要么

  • 问题内容: 我有三部分字符串,每个部分用 符号分隔 。例如, 现在,当我使用这样的方法拆分它时: 它包含整个字符串作为单个元素的数组。 但是当我使用这个: 它完美的作品是什么,我想这意味着 现在的数组包含,并分别对指数0,1和2。 我想知道为什么第一次使用时不起作用,因为我在使用 问题答案: 因为字符是在正则表达式中用来标记行尾的保留令牌。因此,您必须使用进行 转义。

  • 问题内容: 我现在有点困惑。我尝试过: 并得到: 但是,我想要: 我的代码有什么问题? 问题答案: 您没有将其分配给。字符串是 不可变的 。 您需要将其分配回。

  • 问题内容: 我正在尝试这样做: 第一行有效: 但是接下来的两个: 和 只是输出 为什么? 问题答案: 因为你需要加入同,只是列出了内容直接,内容不具有完整路径。 范例- 如果未提供完整路径,则在当前目录中搜索,因此当您给出时,将获得正确的列表。 范例- 假设某个文件夹-具有文件-并在其中。 当您执行-时,返回的列表类似于- 即使您在其中提供绝对路径,列表中返回的文件也将具有指向目录的相对路径。您将

  • 我想知道两次当地约会之间的时间。我使用了下面的代码: 我有以下错误:

  • 我有一个用户和角色的存储库。两个实体在DB中有不同的表。我尝试加载像或相同的想法,但使用Spring数据与LoadGraph。但是当我调用时,我得到了异常。请帮我解决这个问题。谢谢你。 存储库: 例外: WARN: HHH000104: firstResult/max使用集合读取指定的结果;在内存中应用!Hibernate:选择不同的user0_. id作为id1_1_0_,role1_user_