查找当前目录及其子目录中所有扩展名为 .png 的文件

查找当前目录及其子目录中所有扩展名为 .png 的文件

在目录及其子文件夹中,我需要查看所有带有png扩展名的文件。

为此,我使用了命令ls -R *.png

我收到错误,提示目录*.png不存在。我很惊讶我的正则表达式无法被识别。

ls: Cannot read '*.png': the file or the directory doesn't exist

答案1

寻找匹配的文件正则表达式, 使用find使用-regex选项:

find [startingPath] -type [fileType] -regex "[regularExpression]"

就你的情况而言:

  • 如果要搜索以f结尾的文件(文件类型).png,从当前目录开始:

    find . -type f -regex ".*\.png"
    
  • 如果您想要获得ls类似输出,请使用以下-ls操作:

    find . -type f -regex ".*\.png" -ls
    

    (输出的格式与 相同ls -dils)。

  • 如果要为每个文件执行一个命令,请使用操作-exec,例如:

    find . -type f -regex ".*\.png" -exec file {} \;
    

    ... 将打印每个匹配文件的文件类型信息。

还有更多你可以做的事情find,只需阅读手动的


作为@steeldriver 在评论中说,您的命令中没有正则表达式。*.png是一个 shell glob 并且被扩展 ls运行。假设当前目录中有两个文件:

picture1.png
picture2.png

...然后ls -R *.png将被扩展为:

ls -R picture1.png picture2.png

在这种情况下,该-R选项不是特别有用,因为没有指定ls可以递归的目录。

如果 shell 找不到任何匹配的名称,它会按字面意思传递参数(取决于 shell,但 bash 会这样做):

ls -R *.png

... 并ls抱怨,因为没有名为 的文件*.png

答案2

另一个选择是find使用 globstar:

shopt -s globstar
ls **/*.png

之后可选择取消设置 globstar:

shopt -u globstar

来自bash手册页:

globstar
    If set, the pattern ** used in a pathname expansion context will
    match all files and zero or more directories and subdirectories.
    If the pattern is followed by a /, only directories and
    subdirectories match.

答案3

正确的用法是

 ls -R | grep '\.png$'

此命令仅适用于没有空格、换行符或特殊字符的普通文件名。find按照 danzel 或 globstar 的建议使用,或按照 DoVo 的建议使用。

相关内容