如何在通配符嵌入式“查找”搜索中排除/忽略隐藏文件和目录?

从(注意“一些文本” 之前和之后通配符开始

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(这是括号表示否则没有斜线)