計算具有特定名稱的目錄中的文件數
我在這裡找到了這段程式碼https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html這很好地給了我目錄中的文件數量。
ls -1 | wc -l
但我只想知道這些文件中有多少以 2009 開頭(例如
20091210_005037.nc
)。我試過
ls -1 | wc -l 2009*
了,但這會慢慢列出所有文件,似乎沒有給我一個數字。
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 (withshopt -s globstar
inbash
, orset -o extended-glob
inyash
, or in any other shell that may support it), 遞歸計數:set -- **/2009* echo "$#"
該模式
**
幾乎匹配*
,但也匹配/
路徑名。