从开始(请注意“某些文本”前后的通配符)

find . -type f -name '*some text*'


如何排除/忽略所有隐藏的文件和目录?

我已经使用Google搜索太长时间了,遇到了一些-prune和! (感叹号)参数,但没有适合的(和简约的)示例。

|插入grep是一种选择,我也欢迎其中的示例;但主要是我对仅使用find的简短的单行代码(或几个独立的单行代码,说明实现同一命令行目标的不同方式)感兴趣,因此请注意:在linux中查找文件并排除特定目录似乎密切相关,但a)尚不被接受,b)是相关的,但又有所不同,但是c)可以提供启发并帮助查明混乱之处!

编辑

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"起作用。正则表达式查找“​​任何东西,然后是斜杠,然后是点,然后是任何东西”(即所有隐藏的文件和文件夹,包括其子文件夹),以及“!”否定正则表达式。

评论

对您在编辑中提出的问题没有帮助,但请在此处查看我的问题及其答案:unix.stackexchange.com/q/69164/15760以及答案中的链接。

相关:使用Unix / Linux find搜索时排除隐藏文件吗?

#1 楼

这样会打印出属于目录的所有文件,并跳过隐藏的文件和目录:

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


评论


请注意最后一个,最后需要该-print!另外,不确定-name'\。*'是否比-path`更有效(因为该路径正在搜索子路径,但是这些将被删除)

– artfulrobot
2014年4月29日上午11:18

的特殊含义是什么?在这种情况下?

–frostschutz
15年1月15日在15:40

@frostschutz查找后的点表示当前目录:查找将查看当前目录下的所有文件和目录。 path之后的参数是一个正则表达式,其中的点通常表示“任何字符”,以使其表示文字点,我们必须使用反斜杠对其进行转义。 -name之后的参数不是正则表达式,但是它会扩展通配符,例如??和*像shell一样。

– Flimm
2015年1月15日17:23



@frostschutz其实,想起来,我可能是错的。具有特殊的意义。

– Flimm
16年8月5日13:00



@Flimm是的,不需要逃脱..据我所知,只有这些需要逃脱:* 、?和[]。

– thdoan
17年2月15日在9:16

#2 楼

这是排除点文件的几种方法之一,这些点文件也可以在BSD,Mac和Linux上正常工作:

find "$PWD" -name ".*" -prune -o -print




$PWD打印当前目录的完整路径,以使该路径不会以./开头。


-name ".*" -prune匹配以点开头但不下降的任何文件或目录

-o -print表示如果前一个表达式不匹配则打印文件名。默认情况下,使用-print-print0导致所有其他表达式均不打印。


评论


请解释/详细说明“令人震惊的复杂”;已经给出的答案和您的答案似乎提供了相反的证据……?

–关于坚果的坚果
16-3-24在22:13

“令人震惊的复杂”可能太过分了。我改写了答案,直达重点。我认为我发布的答案很难理解,而且如果不仔细阅读手册页就很难看到。如果仅使用GNU find,那么还有更多可能的解决方案。

–eradman
16 Mar 28 '16 at 14:50

-o ...-打印很有帮助。供我使用,现在可以找到...'!' -名称 。 -name'。*'-prune -o ... -print,比包含$ PWD更方便。

–罗杰·佩特
16年8月24日在19:28

#3 楼

find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)


排除所有隐藏目录和$ DIR下的隐藏文件

评论


这是完美的答案。它递归查找所有文件,但不包括目录和隐藏文件的行项目。谢谢!

–凯尔·法里斯(KyleFarris)
2015年10月8日,下午5:41

#4 楼

我最初发布的答案是对上述原始问题的“编辑”:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"起作用。正则表达式查找“​​任何东西,然后是斜杠,然后是点,然后是任何东西”(即所有隐藏的文件和文件夹,包括其子文件夹),以及“!”否定正则表达式。

评论


相似,但仅适用于当前文件夹:find。 \(!-regex'./\..*'\)-type f -maxdepth 1 -print

– phyatt
17 Mar 22 '17在15:44

#5 楼

您不必为此使用find。只需在外壳本身中使用globstar,例如:

echo **/*foo*



ls **/*foo*


其中**/表示递归地创建任何文件夹,并且名称中具有*foo*的任何文件。

默认情况下,使用foo将打印不包括隐藏文件和目录的文件名。

如果没有注意:在Bash 4,zsh和类似的shell中,一个新的glob选项可以工作。


示例:

$ 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


评论


您不需要ls!回声** / * foo *

–凯文·考克斯(Kevin Cox)
16-3-1的3:25

@kenorb(和@ kevin-cox)。你能说得更详细些吗?为什么globstar(= *)在这里工作以及如何工作?斜杠是做什么的?

–关于坚果的坚果
17年5月18日在19:47

@nuttyaboutnatty /意味着文件夹,它将目录和文件名分开。 *基本上代表了一切。

– Kenorb
17年5月18日在20:14



@kenorb是的,但是:一线对原始问题有何帮助?

–关于坚果的坚果
17年5月19日在14:17

@nuttyaboutnatty阐明并添加了示例。通过查找忽略隐藏文件的文件,它会有所帮助。

– Kenorb
17年5月19日在16:40



#6 楼

@Flimm的答案很好,特别是因为它可以防止find下降到隐藏目录中。我更喜欢这种简化:

通常排除所有隐藏的路径(常规文件,目录等):

find <start-point> -path '*/.*' -prune -o <expression> -print


例如,使用以工作目录为起点,以-name '*some text*'作为表达式:

find . -path '*/.*' -prune -o -name '*some text*' -print


与@Flimm的答案相反,简单的情况是没有隐藏的文件或隐藏的目录。对于在文件分隔符-path '*/.*'之后紧随其后具有.的任何路径(常规文件,目录等),/表达式均为true。因此,此行将修剪隐藏的文件和目录。

允许隐藏文件而排除隐藏目录是需要进一步过滤的情况。在此处要修剪的表达式中包含-type d

find <start-point> -type d -path '*/.*' -prune -o <expression> -print 


例如:

find . -type d -path '*/.*' -prune -o -name '*some text*' -print


在这种情况下,-type d -path '*/.*'仅对于目录是true,因此仅修剪目录。

#7 楼

https://askubuntu.com/a/749708/321070
find  -name '.?*' -prune -o -print

的变体而不是将目录设置为完整路径,而是过滤掉ch .?*的内容-文字点,任何字符,然后输入0个或更多字符。

评论


欢迎使用AskUbuntu,我测试了此命令并列出了所有内容。我有点理解您的想法,但情况需要改善一点。

– Wakasaka贞治
20年8月20日在7:59

使用find(GNU findutils)4.7.0对我来说效果很好。您可以共享引起误报的文件名吗?

–尼尔·福尔茨(Neal Fultz)
20年8月20日在16:08

我的英语很烂(或者我很累),这个问题意味着两种情况,“忽略A和B”。第二种情况,找到“隐藏文件和隐藏目录”是完美的。在审查您的第一篇文章时,我只能看到您的答案和OP的标题。道歉。

– Wakasaka贞治
20年8月20日在20:10

#8 楼

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 ".*" \)来查找匹配两个条件的文件名-带有hidden_file但没有前导点的文件名。请注意括号前面的斜杠-它们用于将括号定义为find参数,而不是定义一个子外壳(括号中的含义是不带斜杠)

#9 楼

$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2


注释:



.:当前文件夹
删除-maxdepth 1进行递归搜索

-type f:查找文件,而不是目录(d

-not -path '*/\.*':不返回.hidden_files


sed 's/^\.\///g':从结果列表中删除前置./


#10 楼

回答类似问题的方法是,如果我进入每个文件夹,然后执行ls,它将给我带来与我相同的结果。我必须添加-type f才能正常工作。

find . -not -path '*/\.*' -type f