Bash
列出文件夾名稱與模式匹配的每個文件夾中的文件數
我想遞歸搜尋目錄樹並列出每個文件夾中可用的文件數量,這些文件的名稱與給定字元串對應。實際上,我想返回以下結果:
ls -l | wc -l
對於我通過
find
.程式碼
下面的程式碼正確列出了每個文件夾中名稱包含Magic Data字元串的文件數。
find /path/to/cool/stuff \ -maxdepth 4 \ -type d \ -name '*Magic Data*' \ -print0 | xargs \ --verbose \ -0 -I {} ls -l {}
我想擴展它並將結果
ls
傳遞給 towc -l
。試圖
find /path/to/cool/stuff \ -maxdepth 4 \ -type d \ -name '*Magic Data*' \ -print0 | xargs \ --verbose \ -0 -I {} ls -l {} | wc -l
這失敗並列印:
ls -l /path/to/cool/stuff/some/folders/Magic Data ls -l /path/to/cool/stuff/some/folders2/Magic Data
期望的輸出
/path/to/cool/stuff/some/folders/Magic Data 29 /path/to/cool/stuff/some/folders2/Magic Data 30
所需的輸出將包含:
- 搜尋文件夾的完整路徑
- 的輸出
wc -l
,在這種情況下反映了非隱藏文件的數量
解決這個問題的主要方法有兩種:
- 修改該
find
命令,使其僅進入您感興趣的目錄,然後x
為其中找到的每個文件列印一個字元(例如 )。然後計算用 產生的那個字元的數量wc -l
。輸出字元比路徑名更安全,因為 Unix 中的路徑名可能包含換行符。這個解決方案有點棘手,因為它涉及使用-prune
忽略我們不感興趣的目錄,或者! -path
.- 就像您到目前為止所做的那樣查找目錄,然後使用內聯腳本來計算其中的文件。這更簡單,我將在下面顯示。
find /path/to/cool/stuff -maxdepth 4 -type d -name "*Magic Data*' \ -exec bash -O dotglob -c ' dir=$1 set -- "$dir"/* printf "%s %d\n" "$dir" "$#"' bash {} ';'
在這裡,我們像你一樣找到目錄,然後,對於每個目錄,我們執行這個簡短的
bash
腳本:dir=$1 set -- "$dir"/* printf "%s %d\n" "$dir" "$#"
這從命令行獲取目錄的路徑名(由 給出
find
),並在其中擴展*
glob 模式。通過dotglob
在腳本的命令行上設置 shell 選項,我們可以保證還計算隱藏文件和目錄(刪除-O dotglob
以不計算隱藏名稱)。我們將所有名稱擴展為 的參數
set
,這會將位置參數設置為擴展條目。位置參數的數量可用作$#
,因此它也是該特定目錄中的文件數。有關的: