2011-06-07 77 views
8

我的目標是編寫一個腳本以遞歸方式搜索當前工作目錄和子目錄,並打印出普通文件的數量,目錄的計數,塊特殊文件的計數,字符特殊文件的數量,FIFO的數量和符號鏈接的數量。我必須使用條件測試[[]]。問題是我不太確定如何開始。遞歸計算特定文件BASH

我試着像下面搜索所有普通文件,但我不知道如何遞歸函數的具體在bash腳本:

function searchFiles(){ 
    if [[ -f /* ]]; then 
     return 1 
    fi 
} 
searchFiles 
echo "Number of ordinary files $?" 

,但我得到0的結果。任何人都可以幫忙嗎?

+0

我們在哪裏遞歸調用?以及爲什麼遞歸。請注意,由於返回值受限於1個字節(8位字節),因此您只能返回255的最大值。 – phoxis 2011-06-07 17:01:32

+0

看看'pushd'和'popd' – phoxis 2011-06-07 17:05:42

回答

38

爲什麼不使用find

$ # Files 
$ find . -type f | wc -l 
327 
$ # Directories 
$ find . -type d | wc -l 
64 
$ # Block special 
$ find . -type b | wc -l 
0 
$ # Character special 
$ find . -type c | wc -l 
0 
$ # named pipe 
$ find . -type p | wc -l 
0 
$ # symlink 
$ find . -type l | wc -l 
0 
+0

我很想去,但我們被告知要專門使用這個條件。但我會盡力解決這個問題。 – jamesy 2011-06-07 17:07:53

+0

「我們被告知」...因爲這是一項任務? – Amanda 2012-06-21 13:33:01

+0

@Amanda:*這是一項任務「 - 鑑於這是一年前,我認爲過去式會更合適。 – MattH 2012-06-21 13:37:40

3

的東西,讓你開始:

#!/bin/bash 

directory=0 
file=0 
total=0 

for a in * 
do 
    if test -d $a; then 
     directory=$(($directory+1)) 
    else 
     file=$(($file+1)) 
    fi 

    total=$(($total+1)) 
    echo $a 

done 

echo Total directories: $directory 
echo Total files: $file 
echo Total: $total 

沒有在這裏遞歸不過,對於您可以訴諸ls -lR或相似的;但如果你要使用外部程序,你應該再次使用find,這就是它設計的目的。

+1

而不是'*'使用'**'進行遞歸。'shopt globstar'必須* on *才能使用。('shop-globstar'啓用) – kon 2011-06-07 23:54:54