find . -type f -name '*some text*'
如何排除/忽略所有隐藏的文件和目录?
我已经使用Google搜索太长时间了,遇到了一些-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
选项运行会针对整个路径字符串检查模式。 *
是通配符,/
是目录分隔符,\.
是点(必须转义以避免特殊含义),而*
是另一个通配符。 -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/321070find -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
评论
对您在编辑中提出的问题没有帮助,但请在此处查看我的问题及其答案:unix.stackexchange.com/q/69164/15760以及答案中的链接。相关:使用Unix / Linux find搜索时排除隐藏文件吗?