ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在尝试查找具有特定扩展名的文件。例如,我想查找所有名为 Robert 的 .pdf 和 .jpg 文件

我知道我可以执行此命令

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

但除了扩展名之外,我还需要指定文件本身的名称。我只是想看看是否有一种可能的方法来避免一次又一次地写入文件名谢谢!

复制此命令或其以下命令的任何人都应改用 iname - 这是不区分大小写
好点,艾迪生(因此+1)。但是,OP 似乎想要名为“Robert”且大写“R”的文件。正如我对帖子的解释,这意味着不应输出包含“robert”的文件。 'Robert` 是写的。但是,在某些情况下,有人希望找到“Robert”或“robert”。也许OP处于这种情况。使用 iname 还是 name 取决于您要查找的内容。我一直处于案件至关重要的情况。

w
wjandrea

我的偏好:

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

效果很好,但有一个小缺点是它使您无法执行 find -exec ...
如果我想在特定路径的所有文件夹中查找所有 xxx-deployment.yml 文件怎么办?
如果您将 jpgpng 作为较长路径的一部分,则此方法效果不佳。
E
Etan Reisner

使用 find-regex 参数:

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

或仅使用 -name

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

M
Mark Setchell
find -name "*Robert*" \( -name "*.pdf" -o -name "*.jpg" \)

-o 表示 OR 条件,您可以在大括号内添加任意数量的条件。因此,这意味着要查找名称中任何位置包含“Robert”一词且名称以“pdf”或“jpg”结尾的所有文件。


j
jxh

作为在 find 上使用 -regex 选项的替代方法,由于问题标记为 ,您可以使用大括号扩展机制:

eval find . -false "-o -name Robert".{jpg,pdf}

查找报告“路径必须先于表达式”,有什么问题?我通常添加引号来解决它,但不适用于此表达式。谢谢!
我怀疑您在上面的命令中忘记了 eval.,或者您的 find 是更复杂的东西的别名,或者您没有在您的 Linux 版本上使用普通的 GNU find
感谢您的回复,我使用了这样的脚本: FILEEXTEIONS=cs,[ch] eval find 。 -false "-o -name *".{$FILEEXTEIONS},它会报告该错误。
据我所知,大括号扩展大括号内不会发生变量扩展。
我想在 Android shell 中使用这种技术,但它的 find 不支持 -false。我通过给出两个相互排斥的条件来解决这个问题,所以它们都是错误的:-inum 1 -inum 2
C
Community

此 q/a 展示了如何将 find 与正则表达式一起使用:How to use regex with find command?

模式可能类似于

'^Robert\\.\\(h|cgg\\)$'

c
clt60

作为脚本,您可以使用:

find "${2:-.}" -iregex ".*${1:-Robert}\.\(h\|cpp\)$" -print

保存为 findcc

chmod 755 查找

并将其用作

findcc [name] [[search_direcory]]

例如

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)$'

o
once

使用 bash 通配符(如果 find 不是必须的)

ls Robert.{pdf,jpg} 

w
wuseman

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

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

h
heyzsh

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

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

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