脚本中的 \; 是什么意思?

脚本中的 \; 是什么意思?

以下命令中是什么\;意思?我也不确定是什么{}意思。\;真的有必要吗?

find ./ -name file_1 -exec cp {} ./ \;

答案1

在您的示例中\;是 find 命令的一部分。(参见男人1找到)。 也是一样{}

这个精确的命令指出:

  • 查找当前目录中的所有内容(点或在您的情况下./
  • 其中文件或目录名称为file_1
  • 进而执行执行以下命令:cp {} ./
    其中 {} 将替换找到的文件或目录。

结果是所有名为 file_1 的文件和目录都将被复制到当前目录中。(如果有多个文件或目录同名,它们可能会被覆盖)


一般性的解释就这么多。现在来看看具体细节:

将对 find 找到的每个项目运行的命令是: 这是和cp full_path_to_item ./
之间的内容-exec;

但是分号在 bash 中是一个特殊字符。如果我们不对其进行任何特殊处理,shell 就会将其吃掉。因此,我们用反斜杠对其进行转义。这告诉 shell 不要管它,而是将其传递给 find。


请注意,您需要对所有特殊字符执行此操作。例如,您不能简单地在文件名中使用星号(因此找不到 . -type f -name *.mp3 ....)

答案2

分号需要转义的原因是,find如果不转义,它将由 shell 而不是 by 解释。find希望在命令行上看到这个,所以反斜杠告诉 shell 忽略它并将其传递给。看到分号find至关重要,否则它会给你一个错误。find

{}也由 解释find。这是您要运行的命令中放置的占位符,对于find找到的每个文件,它将用文件名替换这两个括号并运行您的命令。

在您的示例中,如果找到 file_1,则会运行以下命令:

cp file_1 ./

答案3

{} \; 与 shell 关系不大,但与 find 命令期望 -exec 子命令使用的参数关系更大。{} 替换为当前文件名,例如,这会导致 find 执行命令 ls -d FILENAME,其中 FILENAME 替换为其找到的每个文件。\; 用作 -exec 参数的终止符。请参阅 find 的手册页,例如在 linux shell 上键入 man find,然后在那里查找字符串 -exec 以查找描述。

相关内容