理解find命令
find命令使用通配符,而不是正则表达式
对于如下两个命令
find ./ -name *txt
和 find ./ -name \*txt
这两个命令之间的区别在于 shell 对通配符字符 * 的解释和展开方式不同。
find ./ -name *txt
:在这个命令中,shell 在将命令传递给 find 之前执行通配符展开。*txt 被视为通配符模式,shell 会尝试匹配当前目录中以 “txt” 结尾的文件或目录。如果有匹配该模式的文件或目录,shell 在执行 find 命令之前会将它们替换。因此,传递给 find 的命令可能会因当前目录中匹配的文件或目录而有所不同。
find ./ -name \*txt
:在这个命令中,反斜杠 \ 被用作转义字符,防止 shell 展开通配符。*txt 被原样传递给 find 命令。find 命令本身执行模式匹配,在当前目录(以及子目录)中查找以 “txt” 结尾的文件或目录。
为了更清楚地理解区别,我们来看一个示例情况:
假设当前目录中包含以下文件:file1.txt、file2.txt 和 file.txt。
对于 find ./ -name *txt
,shell 在执行 find 命令之前,会将 *txt 展开为 file1.txt 和 file2.txt(匹配当前目录中的文件)。因此,实际执行的命令变为 find ./ -name file1.txt file2.txt
。find 命令搜索名为 file1.txt 和 file2.txt 的文件。
对于 find ./ -name \*txt
,由于使用了反斜杠 \ 作为转义字符,shell 不会展开通配符。传递给 find 的命令是 find ./ -name *txt
。find 命令自身执行搜索,匹配当前目录(以及子目录)中以 “txt” 结尾的任何文件。因此,它会搜索 file1.txt、file2.txt 和 file.txt。
为了避免不一致和确保可预测的行为,通常建议在处理通配符模式或正则表达式时使用引号或转义字符,以防止意外的 shell 展开。
如可以使用find ./ -name “*txt”
避免这种情况