【问题标题】:Unable to understand the syntax of the command find无法理解命令 find 的语法
【发布时间】:2010-10-14 19:04:46
【问题描述】:

find 命令似乎与其他 Unix 命令不同。

为什么下面的命令末尾有空大括号和倒闪?

find * -perm 777 -exec chmod 770 {} \;

我找到了大括号的一个原因,但没有找到向后闪烁的原因。

大括号显然是路径

与 -exec 相同,除了 ``{}'' 是 替换为尽可能多的路径名 每次调用都可能 实用性

【问题讨论】:

  • 大括号还允许您运行不希望(或要求)文件名作为最后一个参数的命令。您可以使用大括号将文件名插入到您想要的任何位置,甚至可以作为要执行的程序的名称!

标签: shell find


【解决方案1】:

-exec 命令后面可以跟任意数量的参数,这些参数构成要对找到的每个文件执行的命令。需要有某种方法来识别最后一个参数。这是什么 \;做。请注意,在 -exec 开关之后可能会出现其他内容:

find euler/ -iname "*.c*" -exec echo {} \; -or -iname "*.py" -exec echo {} \;

(这会在 euler 目录中找到所有 c 文件和 python 文件。)

exec 不要求完整命令包含在引号内的原因是,在大多数情况下,这需要转义命令内的大量引号。

【讨论】:

    【解决方案2】:

    find 中的字符串{} 被当前文件的路径名替换。

    分号用于终止find 实用程序调用的shell 命令。

    它需要被转义或引用,所以它不会被shell解释,因为;是shell使用的特殊字符之一(列表运算符)。

    另请参阅:Why are the backslash and semicolon required with the find command's -exec option?

    【讨论】:

      【解决方案3】:

      需要(转义)分号,以便“find”可以告诉执行程序的参数在哪里结束(如果有的话)以及“find”的其他参数开始。

      【讨论】:

        【解决方案4】:

        我建议你改为这样做

        find . -perm 777 -print0 | xargs -0 chmod 770
        

        “xargs”表示获取查找结果并一次将 20 个输入到以下命令。

        【讨论】:

        • man xargs(4.4.0 版)没有提到数字 20。不过,可以通过使用 -n20 调用 xargs 来强制执行此行为。
        • “一次 20 个”是平均水平。它确实有很多,因为它认为可以放入普通命令行中,我认为在 POSIX 中是 512 字节长。
        • 字节限制是 LINE_MAX,我发现它的通用定义是 2048。
        猜你喜欢
        • 1970-01-01
        • 2014-12-13
        • 2019-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 2017-03-15
        相关资源
        最近更新 更多