2012-08-10 42 views
1

所以我知道我將如何計算目錄中的文件數 - 我會使用for filename in *循環,然後測試文件名以符合我的目的,但我無法計算出如何循環訪問目錄,然後統計其中有多少(子)目錄。計算一個目錄的內容

任何人都可以指向正確的方向嗎?

+0

我想我會按照以下順序使用:find。 -maxdepth 0 -type d -print | wc' – 2012-08-10 20:33:32

+0

目前還不清楚你在問什麼。你想計數文件或子目錄嗎?你想計算*子目錄中的文件*,還是隻計算頂級文件? – 2012-08-10 21:20:28

+0

我的整個腳本的目的是這樣的:我想讓用戶傳遞一個目錄名稱,更改爲該目錄,並計算該目錄中的目錄數量和文件數量以及它們是否是'-e','' -r'或'-w' – 2012-08-10 21:24:16

回答

2

您可以使用-d來測試其目錄。

您可以使用發現:find . -mindepth 1 -maxdepth 1 -type d

1
((n=0)) 
for fn in * 
do 
    [[ -d "${fn}" ]] && ((n=1+${n})) 
done 

保留一個計數器,只增加它的目錄...

+0

那麼'對於fn來說,''循環過目錄的名字呢? – 2012-08-10 20:57:48

+0

此外,不要顯示太多我的新手,額外的括號和遊輪怎麼樣? – 2012-08-10 20:59:35

+0

是的,'*'匹配當前目錄中的所有內容(除了以'.'開頭的東西外)。雙方括號大致相當於'test'或'['的殼內版本,因此效率更高。雙括號用於標記數學表達式並對其進行評估。閱讀'man bash'瞭解更多信息... – twalberg 2012-08-10 21:14:41

1

你到底想幹什麼?看看wc命令。特別是wc -l,它對輸出中的行數進行計數。您可以使用一組生成輸出的命令,然後將其傳送到wc -l。小心將文件頭和頁腳添加到文件中的命令(如ls -l)。

下面是一些例子:

這算不以.開頭的文件和目錄:

$ ls | wc -l 

它與您的for循環,你在你的問題了。

這將計算所有文件和目錄,包括那些隱藏的個。請注意0​​而不是ls -a。第一個不會列出...作爲文件,而第二個會:

$ ls -A | wc -l 

這將會在計數整個目錄樹中的所有文件和目錄

$ find . | wc -l 

這隻會算在目錄整個目錄樹

$ find . -type d| wc -l 

這將算在整個目錄樹中的所有文件

$ find . -type f | wc -l 

LS - 這會限制你的目錄的當前目錄

$ find . -mindepth 1 -maxdepth 1 -type d | wc -l 

的數量,你可以用它來把它分配給一個變量:

$ num_of_files=$(find . -type f | wc -l) 
+0

嗯,這非常有趣。有沒有添加標誌的方法,比如檢查有多少個可執行文件? – 2012-08-10 21:06:56

+0

@ConnorBlack查看find命令的聯機幫助頁。快速檢查將'-executable'標誌顯示爲參數:'find。 -executable -type f'。在命令行提示符處鍵入'man find'。潛入,不要讓文檔恐嚇你。 – 2012-08-10 21:36:41

0

這裏是如何計算目錄或做目錄名稱的東西。

#!/bin/bash 

old_IFS=$IFS 
IFS=$'\n' 
array=($(ls -F /foo/bar/ | grep '/$')) # this creates an array named "array" that holds 
IFS=$old_IFS       # all the directory names located in /foo/bar/ 

echo ${#array[@]} # this will give you the number of directories in /foo/bar/ 

for ((i=0; i<${#array[@]}; i++)) 
do 
echo ${array[$i]} # this will output a list of all the directories 
done 

另外,您可以:

ls -F /foo/bar/ | grep '/$' | cat > directorynames.txt 

,然後計算行數。或者你可以擺脫這隻貓,並把上面的代碼放在一個for循環中,以便爲每一個換行符計數。