递归查找特定扩展名的文件

109

我想查找特定扩展名的文件。 例如,我想查找所有以Robert命名的.pdf和.jpg文件。

我知道我可以使用以下命令:

$ find . -name '*.h' -o -name '*.cpp'

除了扩展名,我需要指定文件本身的名称。我想知道是否有可能避免反复书写文件名称。


5
复制本命令或以下任何命令的人应该使用iname,它是不区分大小写的。 - Addison
2
好观点,Addison(因此+1)。 但是,看起来OP想要以大写字母'R'命名文件为“Robert”。根据我的理解,这意味着不应输出包含“robert”的文件。 'Robert'是写的内容。但是,在某些情况下,有人希望找到“Robert”或“robert”。也许OP就处于这种情况。使用iname还是name取决于您想要找到什么。我曾遇到过大小写很重要的情况。 - bballdave025
9个回答

137

我的偏好:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert

3
功能不错,但轻微缺点是它会阻止你执行“find -exec ...”命令。 - Mark Setchell
如果我想在特定路径中的所有文件夹中查找所有 xxx-deployment.yml 文件怎么办? - Naim Salameh
如果您的路径中包含jpgpng,那么这种方法可能不太有效。 - AutonomousApps

22

使用 find-regex 参数:

find . -regex '.*/Robert\.\(h\|cpp\)$'

或者只是使用-name

find . -name 'Robert.*' -a \( -name '*.cpp' -o -name '*.h' \)

6
find -name "*Robert*" \( -name "*.pdf" -o -name "*.jpg" \)

-o 表示“或”条件,你可以在大括号内添加任意数量的条件。因此,这句话的意思是查找所有文件名中包含单词“Robert”的文件,并且它们的文件名以“pdf”或“jpg”结尾。


3
作为在使用find命令时,替代使用-regex选项的一种选择,因为这个问题标记为,你可以使用花括号扩展机制:
eval find . -false "-o -name Robert".{jpg,pdf}

找到报告“路径必须在表达式之前”,这是什么问题?通常我会添加引号来解决它,但对于这个表达式不起作用。谢谢! - netawater
我怀疑你要么忘了使用 eval 或者上述命令中的 .,要么你的 find 是某个更复杂的别名,或者你没有在你的 Linux 版本上使用标准的 GNU find - jxh
据我所知,在花括号扩展的大括号内部不会发生变量展开。 - jxh
哦,我继续尝试使用 eval find . -false "-o -name *".{cs,config},它报告了相同的错误。 - netawater
1
我想在Android shell中使用这种技术,但它的find不支持“-false”。为了解决这个问题,我给出了两个互斥条件,使它们共同为false:“-inum 1 -inum 2”。 - starfry
显示剩余3条评论

2

1
作为一个脚本,您可以使用以下内容:
find "${2:-.}" -iregex ".*${1:-Robert}\.\(h\|cpp\)$" -print
  • 将其保存为findcc
  • 使用命令chmod 755 findcc

然后使用它:

findcc [name] [[search_direcory]]

e.g.

findcc                 # default name 'Robert' and directory .
findcc Joe             # default directory '.'
findcc Joe /somewhere  # no defaults

注意:你不能使用

findcc /some/where    #eg without the name...

另外作为替代方案,您可以使用。
find "$1" -print | grep "$@" 

并且

findcc directory grep_options

喜欢
findcc . -P '/Robert\.(h|cpp)$'

1
使用 bash globbing(如果不需要使用 find 命令)
ls Robert.{pdf,jpg} 

0

使用文件数据库查找系统中的文件:

locate -e --regex "\.(h|cpp)$"

请确保已安装locate软件包,即mlocate


0

使用ls递归:(-al包括隐藏文件夹)

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接