Bash

列出文件夾名稱與模式匹配的每個文件夾中的文件數

  • July 22, 2018

我想遞歸搜尋目錄樹並列出每個文件夾中可用的文件數量,這些文件的名稱與給定字元串對應。實際上,我想返回以下結果:

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傳遞給 to wc -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,在這種情況下反映了非隱藏文件的數量

解決這個問題的主要方法有兩種:

  1. 修改該find命令,使其僅進入您感興趣的目錄,然後x為其中找到的每個文件列印一個字元(例如 )。然後計算用 產生的那個字元的數量wc -l。輸出字元比路徑名更安全,因為 Unix 中的路徑名可能包含換行符。這個解決方案有點棘手,因為它涉及使用-prune忽略我們不感興趣的目錄,或者! -path.
  2. 就像您到目前為止所做的那樣查找目錄,然後使用內聯腳本來計算其中的文件。這更簡單,我將在下面顯示。
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,這會將位置參數設置為擴展條目。位置參數的數量可用作$#,因此它也是該特定目錄中的文件數。

有關的:

引用自:https://unix.stackexchange.com/questions/456531