使用通配符递归运行 `ls`

使用通配符递归运行 `ls`

我正在尝试使用以下命令查找特定文件类型的所有项目文件:

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

相关内容