歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> 巧妙刪除帶子目錄的目錄

巧妙刪除帶子目錄的目錄

日期:2017/2/25 10:13:23   编辑:Unix基礎知識
  如現在在操作系統中有個目錄文件compierebook,在其下面有兩個子目錄文件,分別為chap01與 chap02。現在用戶需要刪除目錄文件compierebook。

  【IT專家網獨家】如現在在操作系統中有個目錄文件compierebook,在其下面有兩個子目錄文件,分別為chap01與 chap02。現在用戶需要刪除目錄文件compierebook。此時該如何操作呢?如果用戶直接使用rmdir compierebook命令,那麼系統會提示“目錄非空,不能夠刪除”的錯誤信息。拿到用戶只有先利用命令刪除各個子目錄,然後再來刪除這個 compierebook目錄文件嗎?其實不用。下面筆者就給大家介紹一個刪除帶子目錄的目錄文件。即同時刪除所有的子目錄文件與當前的目錄文件。

  一、文件創建與刪除的控制管理。

  在Unix操作系統中,普通文件與目錄都是文件。為此在操作系統中無論是普通文件還是目錄文件都對應於一個文件名和inode數。當用戶創建一個目錄時,在這個文件的上級目錄文件裡會添加關於創建目錄的 文件名和inode信息。同理,當刪除一個目錄文件時,也會同時刪除其上級目錄文件中關於這個要刪除目錄的信息。所以在刪除一個目錄時,系統會查看這個目錄文件,看看其是否有下級子目錄的信息。如果有的話,就會拒絕刪除,並提醒用戶“目錄非空不能夠刪除”。如果沒有下一級子目錄信息的話,那麼系統就會刪除用戶指定的目錄。所以說,在Unix系統中刪除某個目錄時,必須一級級的刪除。現刪除子目錄,然後再刪除上一級目錄。

  二、在rmdir中帶多個參數。

  在大部分情況下,我們在使用rmdir命令刪除目錄的時候,都只是帶一個目錄文件名參數,如rmdir compierebook。其實查看這個命令的幫助,可以發現這個命令可以帶多個文件名參數,即同時刪除多個目錄文件。如用戶可以使所用rmdir 目錄文件1 目錄文件2 目錄文件3(中間利用空格分割)等來同時刪除多個目錄文件。如果需要注意的是,其在刪除目錄的時候,有先後順序。即先刪除目錄文件1、再刪除目錄文件2、最後刪除目錄文件3。所以說,雖然在同一個命令中帶入了三個參數,但是其在刪除的時候不是一起刪除的,而是根據參數的順序來依次刪除文件。

  這是否可以給我們一點啟示呢?既然其實一個個依次刪除的,那我們就可以將子目錄文件參數放在前、將上級目錄文件參數放在後,是否可以一次性刪除帶子目錄的目錄文件呢?如上例所示,如果筆者使用rmdir chap01 chap02 compierebook會有什麼結果呢?執行這個命令後,大家會驚奇的發現,這個命令可以執行成功。然後再去查看相關的目錄,會發現這個目錄文件(包括其下級的兩個子目錄文件)都已經刪除了。所以說,我們在刪除帶子目錄的的目錄文件時,不需要再分次去執行rmdir命令。而只需要在這個命令中依次填上多個目錄文件名參數,然後執行一次即可。在執行這個命令的時候,系統先刪除子目錄chap01,然後會在其上級目錄文件compierebook中將關於 chap01目錄的文件名和inode信息刪除。這個步驟完成後,再來刪除第一個文件chap02。其也是進行這兩步操作,在刪除自身目錄的同時更新上級目錄文件的相關信息。然後再刪除第三個文件。在刪除第三個文件的時候,由於在目錄文件中已經沒有了子目錄文件的信息,所以此時這第三個文件就可以正常刪除了。

  在執行這個命令的時候,主要注意三個細節問題。一是這個命令可以帶多個目錄文件參數,不同的參數之間利用空格隔開。注意這裡不是利用分號或者冒號等符號分割,只需要使用空格即可。二是這個命令中的各個參數文件是由先後順序的。如果目錄文件的參數位置不對,很可能刪除作業不會成功,甚至會出現一些莫名其妙的結果。對於這一點,筆者在後面的內容中還會具體舉例子說明。第三在刪除某個目錄文件時,用戶必須位於這個目錄之外的位置。如果這個命令中帶了多個目錄文件名參數時,要在這些指定的目錄之外。否則的話系統會提示用戶無法刪除這些目錄。這個比較容易理解,因為在Windows操作系統中也有類似的控制。

  筆者最好強調一點,當刪除某個目錄文件時其主要會進行兩步操作,分別為刪除自身目錄與更新上級目錄中的信息。當一個命令中帶有多個目錄文件參數時,這兩步操作也是同時完成的。而不是說先全部刪除所指定的目錄文件,然後再更新其上級目錄文件中的信息。理解這個內容,對於真正的理解rmdir命令刪除多個目錄文件會有很大的幫助。

  三、若目錄文件名位置放置不當會導致什麼後果?

  如果在使用這個rmdir命令的時候,這個目錄文件名參數的位置放置不對,會有什麼後果呢?如筆者現在是按這個格式書寫這個命令:rmdir compierebook chap01 chap02。在執行了這個命令之後,我們再查看系統目錄會發現compierebook這個目錄文件沒有被刪除。但是其下面的兩個子目錄文件 chao01與chap02已經被刪除了。最後系統會提示用戶“目錄非空不能夠刪除”。這到底是怎麼回事情呢?

  在解釋這個原因之前,筆者再給大家舉一個例子。如筆者現在使用命令rmdir chap01 compierebook chap02。將第一個目錄文件參數與第二個目錄文件參數位置對調一下。然後再執行這個命令,會出現什麼結果呢?其實這個命令的執行結果與上面這個命令的執行結果一樣。compierebook目錄文件仍然存在,但是其與兩個子文件已經被刪除了。不過最後系統仍然會提示一個“目錄非空、刪除失敗”的錯誤信息。Unix操作系統到底是在變什麼模式呢?

  其實,我們只要將這個命令分解成三個命令即可。如可以將rmdir compierebook chap01 chap02命令分解為rmdir compierebook、rmdir chap01 與rmdir chap02。在執行第一個命令的時候,由於此時其下面的子目錄文件還沒有被刪除,故第一個命令執行失敗。然後再執行第二個命令,由於在目錄文件 chao01下面沒有子目錄文件了,故可以正常刪除。同理,第三個命令也正確執行了。從以上的分析中至少可以看出三點。一是某個目錄刪除失敗並不會影響其他的目錄的刪除操作。二是這個命令並不會循環操作。即在刪除第一個目錄文件時,如果失敗了,則會直接跳過。在其他目錄刪除完成之後,不會再回過頭來嘗試再次刪除上次刪除失敗的目錄文件。由於不會循環操作,為此這個目錄文件參數位置的放置就直接影響到這個命令的執行結果。第三是目錄刪除成功不會有錯誤警告信息。但是如果目錄刪除失敗了,則會提醒錯誤信息。如果有兩個目錄文件沒有被成功刪除,那麼系統就會提醒兩個錯誤信息。並且會提示,那個目錄文件沒有被成功刪除。所以這個命令執行完成後,如果有錯誤信息的話,那麼仔細查看這個錯誤提示就非常有必要。特別是對比錯誤信息的條數與提供的目錄文件參數的數量,可以判斷有多少目錄文件被成功刪除了。如利用腳本程序來實現這個功能的話,就可以利用cat命令來統計錯誤信息出現的次數,然後自動與參數的個數進行比較,並得出有多少目錄文件被成功刪除的結論。

  四、利用mkdir來建立目錄樹。

  了解了這個rmdir目錄文件刪除操作的原理之後,那麼再來理解mkdir命令來建立目錄樹就會比較輕松了。建立目錄樹就是一次性建立多個目錄,並且是帶子目錄的目錄。也就是說,現在要一次性建立三個目錄computerbook、chap01、chap02。其中後面兩個目錄為第一個目錄的子目錄。現在這三個目錄都不存在。一個個的運行mkdir命令雖然可以最終實現既定的結果,但是顯然操作起來比較麻煩。如果要建立目錄比較多的話,那要執行能夠多個命令了。其實根據上面的rmdir命令的工作原理,大家也可以想的到,通過mkdir命令加多個參數的形式來一次性建立目錄樹。如要實現上面的需求,可以使用命令mkdir conputerbook chap01 chap02命令即可。注意參數的順序非常的重要。如果參數的位置前後顛倒的話,那麼這個命令就可能執行不成功。會一個目錄文件都沒創建或者只是創建了部分的目錄。所以在使用這個命令的時候,需要注意參數的順序。同時要清楚一點,帶多個參數的情況下,其建立各個目錄的動作是相對獨立的。了解這些內容後,那麼利用mkdir命令來一次性創建目錄樹就會變得簡單許多。

Copyright © Linux教程網 All Rights Reserved