2012-07-22 17 views
2

很簡單的問題匹配的描述:說我有一組文件:如何判斷多少個文件以*在UNIX

a1.txt 
a2.txt 
a3.txt 
b1.txt 

而且我用下面的命令:

ls a*.txt 

它將返回:

a1.txt a2.txt a3.txt 

在bash腳本中有一種方法可以告訴使用*模式時將返回多少結果。在上面的例子,如果我要使用* .TXT答案應該是3,如果我用* 1.txt的答案應該是2

+0

「分隔符「?你的意思可能是「模式」。 – 2012-07-24 21:09:46

+0

@MarkEdgar是的,謝謝,我會進行編輯。 – 2012-07-25 01:00:36

回答

3

您可以結合使用lswc

ls a*.txt | wc -l 

ls命令每行列出一個匹配文件,wc -l統計行數。

+0

很酷,有沒有辦法將這個數字賦給一個變量,即num = ls a * .txt | wc -l其中num變成3? – 2012-07-22 22:40:59

+0

當然,使用反引號:'num = \'ls a * .txt | wc -l \''(注意不要在'='周圍放置空格)然後你可以在腳本中使用'$ num'。 – 2012-07-22 22:43:00

+0

歡呼聲,我會在大約3分鐘內將您的答案標記爲正確。 – 2012-07-22 22:45:00

4

您不能提前知道,但您可以計算返回的結果數量。即

ls -l *.txt | wc -l 

ls -l將顯示匹配指定的通配符的目錄項,廁所-l會給你計數。

你可以在一個shell變量有兩種

num=$(ls * | wc -l) 

num=`ls -l *.txt | wc -l` 

保存這個命令的值,然後使用$num來訪問它。第一種形式是首選。

+0

當文件名包含空格時,'wc -w'不可靠。 'wc -l'更健壯一點。 – 2012-07-22 22:36:22

+0

@larsmans啊..從來沒有遇到過這個問題,謝謝(我會牢記這一點)!我會更新我的答案。我認爲在這種情況下,我應該使用'ls -l' – Levon 2012-07-22 22:37:14

+1

@Levon:請注意,在寫入管道時,'ls'從不嘗試將列表「格式化」爲列。 (至少,在過去25年左右沒有更新的'ls'中 - 你仍然可以找到真正的舊實現,你需要使用'-1'來使它做正確的事情。) – 2012-07-22 22:39:10

5

評論使用ls

  1. 我看到所有其他的答案解析的 ls輸出嘗試此。這是非常不可預知的,因爲當您有 文件名帶有「不尋常的字符」時(,例如空格),這會中斷。
  2. 另一個陷阱是,它是ls執行相關。特定的實現可能會以不同的格式輸出。

關於在bash wiki maintained by Greg Wooledge上解析ls輸出的缺陷有一個很好的討論。

使用溶液的bash陣列

基於上述理由,使用bash語法將是更可靠的選擇。您可以使用glob使用所有匹配的文件名填充bash數組。然後你可以問bash數組的長度以獲得匹配的數量。以下片段應該可以工作。

files=(a*.txt) && echo "${#files[@]}" 

要保存在變量匹配的數量,你可以這樣做:

files=(a*.txt) 
count="${#files[@]}" 

這種方法的另一個優勢是,你現在也有一個數組,你可以遍歷匹配的文件。

注:雖然我一直在重複上面bash的語法,相信上述解決方案適用於所有SH炮彈 - 家庭。

+0

還有一篇關於在bash wiki上解析ls的更深入的文章:http://mywiki.wooledge.org/ParsingLs – jordanm 2012-07-23 03:01:06

+0

@jordanm啊,謝謝!我會用那個鏈接更新我的答案。 – suvayu 2012-07-23 05:34:20

+0

+1 – steffen 2012-07-25 11:47:52

1

爲了對可能具有不可預知名稱的文件進行計數,例如,含新的線,不可打印的字符等,我會用的findawk-print0選項與RS='\0'

num=$(find . -maxdepth 1 -print0 | awk -v RS='\0' 'END { print NR }') 

調整選項find細化計數,例如如果條件開始用小寫a文件與.txt擴展在當前目錄,使用:

find . -type f -name 'a*.txt' -maxdepth 1 -print0 
2

我喜歡suvayu的答案,但有沒有必要使用數組:

count() { echo $#; } 
count * 
相關問題