計算目錄中具有特定名稱的檔案數

計算目錄中具有特定名稱的檔案數

我在這裡找到了這段程式碼https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html這很好地給出了我的目錄中的文件數量。

ls -1 | wc -l

但我只想知道其中有多少文件名以 2009 開頭(例如20091210_005037.nc)。

我嘗試過ls -1 | wc -l 2009*,但它慢慢地列出了所有文件,並且似乎沒有給我一個數字。

答案1

set -- 2009*
echo "$#"

這會將位置參數清單($1$2、 ... 等)設定為符合的名稱2009*。這個列表的長度是$#


問題ls -1 | wc -l 2009*是您wc -l直接在匹配的文件上執行2009*,計算每個文件中的行數。同時,ls -1正在嘗試寫入 的標準輸入wc,但它wc不會從中讀取,因為它被賦予了要處理的顯式檔案清單。

您可能想使用ls -d 2009* | wc -l.這將列出所有符合的名稱2009*(使用lswith-d不列出目錄的內容),並計算輸出中的行數。請注意,-1如果您透過管道傳輸某處的結果,則不需要ls(除非ls是強制列輸出的別名或 shell 函數)。

另請注意,這將為您提供錯誤的計算任何檔案名稱是否包含換行符號:

$ touch '2009
> was
> a
> good
> year'
$ ls
2009?was?a?good?year
$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 May 28 11:09 2009?was?a?good?year
$ ls -1
2009?was?a?good?year
$ ls | wc -l
       5
$ ls -1 | wc -l
       5

然而:

$ set -- 2009*
$ echo "$#"
1

(在大多數 shell 中另外使用set和輸出$#不使用任​​何外部命令)


使用find遞歸計數:

find . -type f -name '2009*' -exec echo . \; | wc -l

在這裡,我們為目前目錄中或下的每個找到的路徑名稱輸出一個點,然後計算它產生的行數。我們不計算檔案名稱字串本身,而是這樣做以避免在檔案名稱包含換行符號時計算太多行。

我們find能夠更密切地控制類型我們計算的文件數量。上面,我們明確測試了常規文件-type f(即不是目錄和其他類型的文件)。 shell 中的模式*不區分目錄和文件,但zshshell 可以用來*(.)修改模式的行為以僅匹配常規文件(使用者zsh可能會在上面和下面的非變體中使用2009*(.)而不是)。2009*find

使用**in (與shopt -s globstarin bash、或set -o extended-globinyash或任何其他可能支援它的 shell 一起)進行遞迴計數:

set -- **/2009*
echo "$#"

此模式**幾乎與 like 匹配*,但也與路徑名交叉匹配/

答案2

嘗試使用以下命令,效果很好並得到了結果

   find . -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'

注意:如果您想在子目錄下也請刪除 maxdepth 選項

答案3

感謝評論中的人,這就是我的問題的答案:

ls 2009* | wc -l

或使用尋找

find 2009* | wc -l

答案4

使用 awk 計算以特定檔案名稱開頭的檔案數。

root@ubuntu$ find . -name "2009*" | awk 'BEGIN{total=0}; {total=total+1} END {print "total files starting with 2009 is " ,total}'
total files starting with 2009 is  4

相關內容