首页 > 解决方案 > 在这段代码中,为什么我们必须在 find ... -exec 之后插入 bash ?; {} 和 ${} 引用有什么区别?

问题描述

我一直在使用代码 1 和 2 中的“find -exec”命令:

代码 1

find . -type d -exec chmod 775 {} +

代码 2

find . -type f -exec mv {} ./.. \;

但有时我看到人们在“-exec”之后使用“bash”或“sh”,如代码 3 和 4:

代码 3

alias foo="find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo \"\$(find \"{}\" -type f | wc -l)\" {}' \; | sort -nr

代码 4

alias foo="find . -maxdepth 1 -mindepth 1 -type d -exec bash -c 'echo \"\$(find \"\${1}\" -type f | wc -l) \"\${1}\" \"' -- \"{}\" \; | sort -nr"

问题 1abc:我们什么时候在 -exec 之后使用 bash 或 sh ?与 chmod 和 mv 相比,echo 有什么特别之处吗?echo 是否属于 bash,如果是,我怎么知道前面还有哪些其他命令需要 bash?

代码 4 是对代码 3 的改进建议,因为他们说“您应该将文件名作为参数传递给内部 find 命令。否则,如果您的某个文件夹的名称中包含“:”,您将遇到问题,这我能够了解。

问题 2abc:我不明白 ${1} 如何使它比 {} 更安全?他们引用的不是同一个东西吗?我尝试用 \"\${1}\" 替换最后一个 \"{}\" 部分,如下所示,但它奇怪地失败了。我不明白为什么。

代码 5

alias foo="find . -maxdepth 1 -mindepth 1 -type d -exec bash -c 'echo \"\$(find \"\${1}\" -type f | wc -l) \"\${1}\" \"' -- \"\${1}\" \; | sort -nr"

标签: bashreferencecommand-line-interfaceexecdollar-sign

解决方案


推荐阅读