Unix find命令中,{}和\;分别是什么意思?

253 浏览
0 Comments

Unix find命令中,{}和\;分别是什么意思?

使用这组命令时,{}\\;字符的作用是什么?\n

find . -name '*.clj' -exec grep -r resources {} \;

0
0 Comments

Unix的find命令是用于在文件系统中搜索文件和目录的强大工具。在使用find命令时,我们经常会遇到一些特殊的符号和标记,比如{}和\;。这些符号和标记的作用是什么呢?

首先,我们来看一个使用find命令的例子:

find . -name *.clj -exec grep -r resources {} \;

上面的命令的作用是在当前目录下搜索所有扩展名为.clj的文件,并在这些文件中查找包含"resources"的内容。那么,{}和\;在这个命令中的作用是什么呢?

{}表示find命令找到的文件的占位符。在执行命令时,每个找到的文件的路径都会被替换为{}。这样,我们就可以在-exec选项后面指定要执行的命令,并使用{}来表示文件路径。

\;表示命令的结束符号。在find命令中,-exec选项后面的命令可以包含多个子命令,用分号来分隔这些子命令。为了避免分号被Shell解释器解释,我们需要在分号前面加上反斜杠来转义。

现在,我们来看一下题目中提到的一个替代命令:

find . -name *.clj | xargs grep -r resources 

这个命令的作用与之前的命令相同,都是在当前目录下搜索所有扩展名为.clj的文件,并在这些文件中查找包含"resources"的内容。但是,这个命令存在一个主要的缺陷,就是对于文件名中包含空格或类似字符的文件处理不正确。

为了解决这个问题,我们可以使用之前提到的{}和\;。修改后的命令如下:

find . -name *.clj -exec grep -r resources {} \;

这样,无论文件名中是否包含空格或类似字符,都能正确处理。

{}和\;是在使用Unix的find命令时经常遇到的符号和标记。{}表示find命令找到的文件的占位符,用于在-exec选项后面的命令中表示文件路径。而\;则是命令的结束符号,用于分隔-exec选项后面的多个子命令。通过正确使用这些符号和标记,我们可以更好地使用find命令来搜索和处理文件和目录。

0
0 Comments

在Unix的find命令中,-exec参数用于获取直到分号;(分号)为止的其余参数,需要对分号进行转义,因此使用\;。在这个范围内,{}会被替换为正在检查的文件名。

解决方法:

要解决这个问题,可以将命令放在一个单独的脚本文件中,然后用-exec参数来调用该脚本文件。这样就不需要担心命令中的分号和大括号的转义问题。

示例代码:

# 创建一个脚本文件,例如myscript.sh
echo "Hello, {}" >> output.txt
# 使用find命令调用脚本文件
find . -type f -exec sh -c 'sh myscript.sh' \;

在上面的示例中,find命令会递归地搜索当前目录及其子目录中的所有文件。对于每个找到的文件,-exec参数会调用一个新的shell,并在其中执行myscript.sh脚本文件。脚本文件将文件名作为参数,并将"Hello, 文件名"写入output.txt文件中。

通过使用独立的脚本文件,我们可以避免在命令中使用大括号和分号时的转义问题。这种方法还可以提高代码的可读性和维护性,因为我们可以将复杂的操作放在脚本文件中,而不是直接写在命令中。

0
0 Comments

在使用Unix的find命令时,有一个问题让人困惑,就是关于{}和\;的用法。通过查看man find文档,可以找到解决方法。在使用-exec参数时,命令会在找到的每个文件上执行,而{}则会被替换为找到的每个文件的名称,命令以\;结束。

在给出的例子中,所有在当前目录(.)下找到的文件,且文件名匹配*.clj,都会执行命令grep -r resources(在这些文件中查找字符串resources)。

这实际上有些冗余,因为-r参数已经用于递归搜索子目录,而这正是find命令已经在做的。我之前没有想到查看man find文档,因为它看起来并不像是find命令的一部分,就像shell扩展、管道或其他重定向操作符一样,它被发现时并不是命令的一部分。我以为它是一种我无法识别的shell语法魔法,除非我已经知道它的名称。

所以,通过查看man find文档,我们可以了解到{}和\;的用法,以及如何正确使用-exec参数来执行命令。

0