我正在尝试使用以下命令查找特定文件类型的所有项目文件:
ls -ltR *.mb
我知道几个文件夹中有我想要的文件,但没有找到任何结果。我做错了什么?
答案1
ls
不匹配模式。它只是列出输入参数中的文件或文件夹。*.mb
由 shell 扩展前传递给ls
,因此如果当前目录中没有命名的文件*.mb
,则不会输出任何内容,否则只会输出当前目录中的文件
递归列出文件的标准方法是使用find
find . -name '*.mb' -type f -printf "%-.22T+ %M %n %-8u %-8g %8s %Tx %.8TX %p\n" | sort | cut -f 2- -d ' '
这样您就可以根据需要自定义输出列表格式。请参阅:按最后编辑日期列出文件
另一种方法是使用globstar
可以使用shopt -s globstar
ls -ltR **/*.mb
第一个**/
将匹配任意子目录路径。然后*.mb
匹配这些目录中的文件
全球星
如果设置,文件名扩展上下文中使用的模式
**
将匹配所有文件和零个或多个目录和子目录。如果模式后跟/
,则仅匹配目录和子目录。https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html
答案2
@phuclv 有两个不错的选择。当我需要做类似的事情时,我通常会将 ls 的输出通过管道传输到 grep,如下所示:
ls -ltR | grep .*\.mb
这会将 ls 的输出发送到 grep 的输入而不是输出到 stdout,然后 grep 仅输出包含正则表达式至少一个匹配的行。
正则表达式
.*\.mb
可以解释为:
.: match any character
*: preceding character or group should appear 0 or more times
\.mb: literally .mb