我正在巨大的目录层次结构中寻找文件“ WSFY321.c”。
通常我会使用GNU查找:find . -name "WSFY321.c"
但是我不知道这种情况,它可能是大写,小写或混合使用

找到此文件的最简单方法是什么?
是否有比find . | grep -i "WSFY321.c"更好的东西?

#1 楼

GNU find的最新版本具有-iname标志,用于不区分大小写的名称搜索。

find . -iname "WSFY321.c"


评论


另外,由于您要专门查找文件,因此您可以使用-type f标志将其剔除几下,如果inode是目录,它就不会打扰到该名称。但这就是学步的优化水平...

– Shadur
2012年2月20日在9:47

对于某些正则表达式,您可以找到。 -iname \ * WSFY321.c \ *-键入f

– Benj
16年6月11日在22:01



#2 楼

使用GNU find或具有该版本的find的其他版本:

find . -iname 'WSFY321.c'


使用其他版本的:

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'


或更慢但更容易输入的折衷方案:

find . -name '????321.c' | grep -i '/WSFY[^/]*$'


或者在zsh中:

print -rl -- **/(#i)WSFY321.c


评论


@Gilles grep版本仅过滤大写字母,我不理解'[^ /]'..(not /)

– Peter.O
2012年2月20日在6:22



@Gilles在第一种情况(精确的文件名)上使用单引号而不使用完全没有引号的参数是什么?

–伯恩哈德
2012年2月20日在7:14

@ Peter.O bash版本中的/后没有*。我的意思是grep -i。我使用[^ /] *而不是。*,以免在名称以WSFY开头的目录中捕获文件。

–吉尔斯'所以-不再是邪恶的'
2012年2月20日在10:08

@ Bernhard一致性。

–吉尔斯'所以-不再是邪恶的'
2012年2月20日在10:08

谢谢吉尔斯:我删除了前面的注释,使用了不正确的语法,并测试了修订后的版本,但是如果没有*,它就无法工作(出于意外原因;至少对我而言)。不区分大小写的选项不再起作用:shopt -s extglob nocaseglob globstar; printf'%s \ n'** / WSFY321.c ...我想这就是为什么它被称为nocase球的原因:它仅在一个球的上下文中起作用(或者看起来)。

– Peter.O
2012年2月20日在11:34



#3 楼

适用于macOS的两种解决方案:

使用GNU find

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'


使用GNU sed

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\L]|g' <<<'WSFY321.c')"


评论


在macOS Sierra上,默认情况下-iname选项可用。

– ThomasW
17年5月25日,1:13