Ls

計算具有特定名稱的目錄中的文件數

  • May 28, 2019

我在這裡找到了這段程式碼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正在嘗試寫入 的標準輸入wcwc因為它被給出了一個明確的文件列表來處理,所以它沒有讀取。

您可能想使用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 (with shopt -s globstarin bash, or set -o extended-globin yash, or in any other shell that may support it), 遞歸計數:

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

該模式**幾乎匹配*,但也匹配/路徑名。

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