2016-09-29 39 views
1

我試圖編寫一個bash腳本來計算文件數量和本地目錄的目錄數量。這是我第一次嘗試:使用bash對文件(和目錄)名稱進行迭代

#!/bin/bash 
files=0 
dir=0 
for file in `ls` 
do 
    if [ -d $file ] 
    then 
     dir=$(($dir+1)) 
    else 
     files=$(($files+1)) 
    fi 
done 
echo "files=$files, direcotries=$dir" 

然而,for命令不遍歷文件和目錄我希望的名字。如果文件ou目錄的名稱有空格,則這不起作用。當名稱中有空格時,變量「file」將假定文件(或目錄)名稱中每個單詞的值。

有沒有辦法做到這一點?

+0

請注意,僅使用'ls',您可能會錯過某些文件或目錄。爲了實現所有這些,請改用'ls -A'。 – user1934428

回答

1

使用通配符:for file in *; do …; done。這使名稱中的空格保持正確。也考慮shopt -s nullglob。您的代碼和我的建議都不會以點號.開頭。

另外,使用if [ -d "$file" ]用變量值周圍的雙引號來避免間距問題。

因此:

#!/bin/bash 

shopt -s nullglob 
files=0 
dir=0 
for file in * 
do 
    if [ -d "$file" ] 
    then 
     dir=$(($dir+1)) 
    else 
     files=$(($files+1)) 
    fi 
done 
echo "files=$files, directories=$dir" 

在bash中,也有寫算術的其他方式,如((files++))

1

我認爲喬納森·萊弗勒的回答正是你所需要的。

另一種顯示的bash陣列的能力和消除了環路的需要:

shopt -s nullglob 
dirs=(*/) 
ndir="${#dirs[@]}" 
files=(*) 
nfile=$(("${#files[@]}" - ndir)) 
echo "files=$nfile, directories=$ndir" 

這種工作方式如下:

  • dirs=(*/)創建目錄的名稱的數組。

  • ndir="${#dirs[@]}"統計目錄的數量。

  • files=(*)創建所有文件和目錄的名稱數組。

  • nfile=$(("${#files[@]}" - ndir))通過取files的元素數量並從中減去目錄數量來計算文件數量。

  • echo "files=$nfile, directories=$ndir"打印結果。

這隻適用於支持數組的shell,比如bash。在很多系統上,shdash,它不支持陣列。所以,在執行這個腳本時使用bash script

相關問題