2012-09-27 77 views
2

嗨我想要遞歸地刪除/刪除目錄及其子目錄和文件。我不想使用rm -r。我已經拿出了下面的代碼。不使用rm命令遞歸地刪除目錄

function recursive(){ 
      for i in "$1"/*; do 

        if [ -d $i ];then 
          echo "FILE $i IS A DIRECTORY" 
          if [ "$(ls -A $i)" ];then 
            echo "DIRECTORY IS NOT EMPTY CALLING RECURSIVE AGAIN" 
            recursive $i 
          else 
            echo "DELETE THIS DIRECTORY: ITS EMPTY" 
          fi 
        elif [ -e $i ];then 
          echo "DELETING FILE $i" 
        else 
          echo UNKNOWN FILE $(basename $i) 
        fi 
      done 

    } 

的問題是,我深入挖掘子目錄,我可以刪除的道路上他們的文件,但一旦我到目錄樹的底部,我必須刪除所有這些現在空目錄(也許在我回來的路上?)

真的很感激,如果有人能幫助我的邏輯或引導我在正確的方向。

THIS問題的答案是有道理的,但我不知道如果子目錄的級別很少,它怎麼處理?

+1

一旦你到達目錄樹的底部,你最深的遞歸()完成其for循環。然後它跳到下一個較高的那個,完成'遞歸$ i'。在遞歸$ i'調用之後,該目錄應該是空的,因此可能會刪除該目錄。 – finity

+2

「我想開一個螺絲,但我不想用螺絲刀。」 *爲什麼*你不想使用'rm -r'?如果沒有別的辦法,答案可以幫助我們更好地理解你的要求。 –

+2

我認爲他是爲了教育目的而做的。 – CQQL

回答

2

刪除目錄的內容後,無論如何都可以將其刪除。所以只要去掉else語句和移動刪除目錄命令一個級別:

function recursive(){ 
     for i in "$1"/*; do 

       if [ -d $i ];then 
         echo "FILE $i IS A DIRECTORY OR A (SYM)LINK TO ONE" 
         if [ "$(ls -A $i)" ];then 
           echo "DIRECTORY IS NOT EMPTY CALLING RECURSIVE AGAIN" 
           recursive $i 
         fi 

         echo "DELETE THIS DIRECTORY: ITS (NOW) EMPTY" 
       elif [ -e $i ];then 
         echo "DELETING FILE $i" 
       else 
         echo UNKNOWN FILE $(basename $i) 
       fi 
     done 

} 
+0

我認爲這是有道理的...我現在已經把我的頭包裹起來了...會嘗試一下,然後發佈完整的答案 – Achilles

+1

**危險**:這有可能會導致非常非常糟糕的意想不到的事情是指向已刪除樹之外的符號鏈接 – sehe

4

我會簡單地使用

find "$1" -delete 

unlink可能是一個很好的想法太多,但我不知道你是否會考慮作弊:)