使用通配符遞歸來運行“ls”

使用通配符遞歸來運行“ls”

我正在嘗試使用以下命令查找特定文件類型的所有專案文件:

ls -ltR *.mb

我知道幾個資料夾中有我想要的文件,但我沒有得到任何結果。我做錯了什麼?

答案1

ls與模式不匹配。它只是列出輸入參數中的文件或資料夾。*.mb由外殼擴展傳遞給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

相關內容