如何在通配符嵌入式“查找”搜索中排除/忽略隐藏文件和目录?
从(注意“一些文本” 之前和之后的通配符开始 )
find . -type f -name '*some text*'
如何排除/忽略所有隐藏文件和目录?
我已经谷歌搜索太久了 ,遇到了一些-prune和! (感叹号)参数,但没有适合(和简约)的例子,只是工作 。
管道 |
grep
将是一个选项,我也欢迎这样的例子; 但主要是我对一个简短的单线程(或几个独立的单行程序,说明实现相同命令行目标的不同方法) 只对使用find
感兴趣。
ps: 在linux中查找文件并排除特定目录似乎密切相关,但a)尚未被接受,b)是相关但不同和不同的,但c)可能提供灵感并帮助查明混乱!
编辑
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
,有效。 正则表达式寻找“任何东西,然后是斜线,然后是点,然后是任何东西”(即所有隐藏的文件和文件夹,包括它们的子文件夹),以及“!” 否定正则表达式。
这将打印作为目录后代的所有文件,跳过隐藏文件和目录:
find . -not -path '*/\.*'
因此,如果您要查找其名称中包含some text
的文件,并且您想要跳过隐藏的文件和目录,请运行:
find . -not -path '*/\.*' -type f -name '*some text*'
说明:
-path
选项运行检查整个路径字符串的模式。 *
是通配符, /
是目录分隔符, \.
是一个点(它必须被转义以避免特殊含义), *
是另一个通配符。 -not
表示不选择与此测试匹配的文件。
我认为find
并不足以避免在前一个命令中以递归方式搜索隐藏目录,所以如果你需要速度,请改用-prune
,如下所示:
find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print
这是排除在BSD,Mac和Linux上也能正常工作的点文件的少数方法之一:
find "$PWD" -name ".*" -prune -o -print
-
$PWD
打印当前目录的完整路径,以便路径不以./
开头。 -
-name ".*" -prune
匹配以点开头但不下降的任何文件或目录 -
-o -print
表示如果前一个表达式与任何内容不匹配,则打印文件名。 使用-print
或-print0
会导致默认情况下不打印所有其他表达式。
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)
排除$ DIR下的所有隐藏目录和隐藏文件
我最初发布的答案是上面原始问题的“编辑”:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
,有效。 正则表达式寻找“任何东西,然后是斜线,然后是点,然后是任何东西”(即所有隐藏的文件和文件夹,包括它们的子文件夹),以及“!” 否定正则表达式。
您不必使用find
。 只需在shell中使用globstar,就像:
echo **/*foo*
要么:
ls **/*foo*
其中**/
表示递归的任何文件夹, *foo*
任何名称中包含foo
文件。
默认情况下,使用ls
将打印除隐藏文件和目录之外的文件名。
如果您没有启用通配,请通过shopt -s globstar
执行此shopt -s globstar
。
注意: 新的globbing选项适用于Bash 4,zsh和类似的shell。
例:
$ mkdir -vp a/b/c/d mkdir: created directory 'a' mkdir: created directory 'a/b' mkdir: created directory 'a/b/c' mkdir: created directory 'a/b/c/d' $ touch a/b/c/d/foo a/b/c/d/bar a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden $ echo **/*foo* a/b/c/d/foo a/b/c/d/foo_not_hidden
find
有一些简洁的逻辑开关,比如-and
和-not
你可以利用它们来找到一个匹配的文件,它有两个规则,如下所示:
$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt $ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \) ./non_hidden_file.txt
如您所见, find
使用两个规则-name '*hidden_file*'
和-and \( -not -name ".*" \)
-name '*hidden_file*'
-and \( -not -name ".*" \)
来查找符合这两个条件的文件名 – filename中包含hidden_file
但没有前导点。 注意括号前面的斜杠 – 它们用于将括号定义为find
参数而不是定义子shell(这是括号表示否则没有斜线)