我在以下位置发现了以下很棒的小脚本关联
$ find /home/bruno/old-friends -type f -exec sed -i 's/ugly/beautiful/g' {} \;
但我真的不明白最后一点
{} \;
有人可以解释一下吗?
谢谢!
答案1
这不完全是一个sed
语法问题,这是一个find
语法问题。
是{}
一个容器,它将替换正在由命令处理的文件的名称sed
。
如果你find
这样使用:
$ find . -type f -name *.py -exec head {} \;
这将查找 Python 脚本并显示每个文件的头。如果当前目录中有三个脚本:
- 1.py
- 2.py
- 3.py
将{}
包含每个文件名并head
在每个文件上执行命令。
参数末尾-exec
需要一个,这样它才能识别命令参数的结尾(在本例中),但为了防止扩展,您需要使用 对其进行转义。;
sed
;
\
请记住,如果您使用以下命令,您可以一次执行多个命令;
:
$ ls; pwd;
这将列出目录 ( ls
) 并打印您的工作目录 ( pwd
)。-exec
参数还需要;
。但由于您不想混淆;
分隔命令的 和 的参数的;
一部分,因此您需要使用 对其进行转义。-exec
find
\
或者,您也可以使用引号将 引起来;
:
$ find /home/bruno/old-friends -type f -exec sed -i 's/ugly/beautiful/g' {} ";"
我希望我已经表达清楚了
答案2
我一直在使用 about.com Linux 页面,它涵盖了
查找——在目录层次结构中搜索文件
作为一段时间的参考,它涵盖了您所询问的命令的部分。
find . -type f -exec file '{}' \;
对当前目录下的每个文件运行“file”。请注意,括号括在单引号中,以防止它们被解释为 shell 脚本标点符号。分号也同样受到反斜杠的保护,尽管在这种情况下也可以使用“;”。
因此,我认为为了安全起见,您的命令应该在括号周围加上分号。
参考链接:
答案3
使用exec
(而不是 xargs)时,{}
必须包含 ,因为它会被 find 命令所针对的文件的名称替换;它是一个通常用引号括起来的占位符,这样如果任何目标文件中有空格,该命令仍将成功运行在所有文件上。必须semicolon
包含 ,因为它是命令的结尾,就像在命令行上分隔多个命令时一样。在这种情况下必须包含 ,escaped
以便 find 命令从 shell 中接收未展开的它(作为文字)。网上有很多关于此内容的教程,例如,这篇有用的文章。
另一篇非常出色且至关重要的文章是伍利奇遗址这篇文章很好地解释了 find 命令、exec 以及在命令或脚本中引用各种元素的重要性。我发现这篇文章和整个网站对于学习 bash 和 bash 脚本非常有用。