
我在這裡找到了這段程式碼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*
(使用ls
with-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 中的模式*
不區分目錄和文件,但zsh
shell 可以用來*(.)
修改模式的行為以僅匹配常規文件(使用者zsh
可能會在上面和下面的非變體中使用2009*(.)
而不是)。2009*
find
使用**
in (與shopt -s globstar
in bash
、或set -o extended-glob
inyash
或任何其他可能支援它的 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