如何查找名称中包含 ~ * 和其他特殊字符的文件?
例如
find . -name "*\*"
应该匹配“任何字符”然后*
,但它不匹配任何内容;如何获得正确匹配文件的命令?
答案1
不同的实现find
,但它们都应该处理通配符中的字符类(POSIX.2,第 3.13 节):
find . -name '*[~*]*'
如果换行符是您的“特殊”字符之一,您可能需要弄清楚如何让您的 shell 传递它来查找。在 Bash 中,您可以使用
find . -name $'*[\t \n]*'
例如,显示包含空格的文件。如果支持的话,更简单的方法是使用字符类:
find . -name '*[[:space:]]*'
答案2
如果您想要比匹配特定字符更通用的内容,则必须使用正则表达式。由于问题没有标记为“linux”,正确的答案将使用 POSIX:
find . | grep '[*~]'
如果你想让它特定于 Linux,你可以使用 GNUfind
选项-regex
(也支持自由BSD)。如果路径名有嵌入的换行符 (很少已完成,但用作经常反例),POSIX find
+grep
将不起作用。但是通过-regex
扩展,这“可以”打印嵌入换行符的名称:
find . -regextype posix-awk -regex '.*[*~]'
虽然 find 的方式是用过的不是问题的一部分。
进一步阅读:
- find——查找文件(POSIX)
- find - 在目录层次结构中搜索文件(GNU)