在目录及其子文件夹中,我需要查看所有带有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 的建议使用。