![如何在嵌入通配符的“查找”搜索中排除/忽略隐藏文件和目录?](https://linux22.com/image/832779/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%B5%8C%E5%85%A5%E9%80%9A%E9%85%8D%E7%AC%A6%E7%9A%84%E2%80%9C%E6%9F%A5%E6%89%BE%E2%80%9D%E6%90%9C%E7%B4%A2%E4%B8%AD%E6%8E%92%E9%99%A4%2F%E5%BF%BD%E7%95%A5%E9%9A%90%E8%97%8F%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
从(注意前后通配符“一些文本”)
find . -type f -name '*some text*'
如何排除/忽略所有隐藏文件和目录?
我已经谷歌搜索太久了,遇到了一些 -prune 和 !(感叹号)参数,但没有合适的(和简约的)示例刚刚起作用。
管道 |
是grep
一种选择,我也欢迎这样的例子;但是主要我对简短的一行代码感兴趣(或几个独立的一行代码,说明实现相同命令行目标的不同方法)只是使用find
。
附言:在Linux中查找文件并排除特定目录似乎密切相关,但 a) 尚未被接受,且 b) 相关但不同且独特,但 c) 可能提供灵感并帮助找出混淆之处!
编辑
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
,有效。正则表达式会查找“任何内容,然后是斜线,然后是点,然后是任何内容”(即所有隐藏文件和文件夹及其子文件夹),而“!”会使正则表达式取反。
答案1
这将打印目录的所有后代文件,跳过隐藏文件和目录:
find . -not -path '*/.*'
因此,如果您正在寻找some text
名称中包含的文件,并且想要跳过隐藏文件和目录,请运行:
find . -not -path '*/.*' -type f -name '*some text*'
解释:
该-path
选项运行针对整个路径字符串的模式检查。*
是通配符,/
是目录分隔符,.
是点(在 Linux 上隐藏文件名以点开头),*
是另一个通配符。-not
表示不选择与此测试匹配的文件。
我认为这还不够find
智能,无法避免在上一个命令中递归搜索隐藏目录,因此如果您需要速度,请改用-prune
如下方法:
find . -type d -path '*/.*' -prune -o -not -name '.*' -type f -name '*some text*' -print
答案2
这是排除点文件的少数几种方法之一,在 BSD、Mac 和 Linux 上也能正常工作:
find "$PWD" -name ".*" -prune -o -print
$PWD
打印当前目录的完整路径,以便路径不以./
-name ".*" -prune
匹配以点开头且不下降的任何文件或目录-o -print
表示如果前一个表达式不匹配任何内容,则打印文件名。使用-print
或-print0
会导致所有其他表达式默认不打印。
答案3
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)
排除 $DIR 下的所有隐藏目录和隐藏文件
答案4
这回答我最初以对上述问题的“编辑”形式发布:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
,有效。正则表达式会查找“任何内容,然后是斜线,然后是点,然后是任何内容”(即所有隐藏文件和文件夹及其子文件夹),而“!”会使正则表达式取反。