2016-04-02 28 views
1

Bir yönetmenin içeriğini bir ağaç biçiminde görüntülemek zorunda olduğum bir bash betiği üzerinde çalışıyorum. Bunu başarmak için tek gömlekler olduğunu biliyorum, ancak yinelemeli bir algoritma kullanarak anlamaya çalışıyorum.Bash Komut Dosyası Yinelemeli Dizin Ağacı

#!/bin/bash 

tree(){ 
    space=$2 
    if [ -d $1 ] 
    then 
     printf "%s" $space "-----|" $1 
     printf "\n" 
     cd $1 
     space="$space-----|" 
     for a in * 
     do 
      tree $a $space 
     done 
     cd .. 
    else 
     printf "%s" $space "-----|" $1 
     printf "\n" 
    fi 
}  

cd $1 
for file in * 
do 
    space="|" 
    tree $file $space 
done 

Ben dizini "Dir" içeren dizinleri "AltDiz1" var "AltDiz2", "SubDir3" ve "filem" dosyası: Burada

Ben bugüne kadar ne olduğunu. "SubDir1", "filea", "fileb" ve "filec" dosyalarını içerir. "SubDir2", "SubSubDir" dizinini ve "fileg", "fileh" ve "filei" dosyalarını içerir. "SubSubDir" dizini "dosyalanmış", "filee" ve "filef" dosyalarını içerir. "SubDir3" dizini dosyaları "filej" "filek" ve "filel" içeriyor. Aşağıdaki

komut satırında ./dirtree Dir girmek

görüntülenir: i dizin SubSubDir olmayan aracılığıyla

|-----|SubDir1 
|-----|-----|filea 
|-----|-----|fileb 
|-----|-----|filec 
|-----|SubDir2 
|-----|-----|SubSubDir 
|-----|-----|-----|filed 
|-----|-----|-----|filee 
|-----|-----|-----|filef 
|-----|-----|-----|fileg 
|-----|-----|-----|fileh 
|-----|-----|-----|filei 
|-----|SubDir3 
|-----|-----|filej 
|-----|-----|filek 
|-----|-----|filel 
|-----|filem 

Bu çıkış o g dosyaları dışında neredeyse doğrudur. Sorun benim boşluklarımda bir yer. Bir dosya önceki alt dizinde bulunmadığında tire işaretlerini sıfırlamam gerekir, ancak bu yineleme işlemini yapabilen bir yöntem bulmalıyım, böylece çizgi sayısı ağacın derinliğine uygun olmalıdır.

Yardımlarınız için teşekkürler.

cevap

3

"Girintiden sonra" space değerini "atma" durumunda olduğunuz zaman, dış döngüye döndüğünüzde ve açıkça | olarak ayarlandığınız zamandır. Herhangi bir yinelemeli aramadan tree'a döndükten hemen sonra yapmanız gerekir. Bunu yapmanın en kolay yolu, değişikliği işlevin yerini belirlemek.

#!/bin/bash 

tree() { 
    local space=$2 
    ... 
} 
+0

Teşekkürler @chepner! – tfreiner