遞歸查找空目錄
我怎樣才能找到每個空目錄,比方說,在 /home/…/Desktop 上。因為我在 Solaris 上,所以我無法使用該
find . -empty -type d
命令。還有其他方法嗎?
(我手邊沒有 Solaris 機器,所以我正在使用聯機幫助頁,所以您可能需要在這裡稍微使用一下語法。)
您可以利用任何空目錄的連結計數為 2 的事實(只有目錄名稱本身
dir
,加上它自己的dir/.
,連結到它);在 UNIX 中,(硬)連結到目錄是非法的,除非在將其添加到(單個)目錄條目或添加目錄條目的過程中,因此這是一個不變數。(基本上是1。)Solaris 不支持該
-empty
選項,但它支持使用恰好n 個連結-links <n>
搜尋事物的選項。所以你想要的命令(我認為;見下文)是:
find /home/.../Desktop -type d -links 2 -print
順便一提…
您對“遞歸”一詞的使用有點模棱兩可,所以請注意,這不會找到只包含空目錄的目錄(或遞歸地等等)。如果你想這樣,如果你想辨識它們以刪除它們,問題就很簡單了。只需重複執行上面的命令,添加
-exec rmdir {} \;
直到沒有剩餘;每次執行它時,都會將樹的父級刪除更深一層,因此除非您有一個非常深的目錄樹,它只由空目錄組成,否則不需要多次執行。(取決於 Solaris *find(1)的工作方式,我認為您也可以find . -type d -exec rmdir -p {};
只執行一次(該-p
選項告訴rmdir(1)*它可以刪除包含空目錄的目錄),但是因為它會嘗試遍歷已刪除的目錄,所以您會收到一堆錯誤消息,您可以忽略這些錯誤消息與您可能關心的錯誤消息混合在一起,所以我d 以這種迭代的方式來代替。)(請注意,find(1)
-depth
的選項在這裡沒有幫助,因為文件*stat()*太早以至於無法更新連結計數。否則,您可以執行並且執行一次就足夠了。)find -depth $dir -type d -links 2 -exec rmdir {} \;
如果您想在不刪除它們的情況下辨識*“*本質上為空”的目錄和只包含空目錄(或以此類推,遞歸方式)的目錄,它會更複雜。我假設一個命令行是可能的,但它將是一個野獸(我相信其他人稍後會採取行動),至少不需要訴諸
perl
或瘋狂sed
/awk
咒語。但我要做的是將目錄樹複製到某個地方,比如*/tmp/tree-copy*,然後執行命令
find /tmp/tree-copy -type d -links 2 -print -exec rmdir {} \; | tee -a /tmp/empty-dirlist
重複直到它不再產生輸出。(
tee -a
讓您查看輸出,但也將其附加到文件*/tmp/empty-dirlist*。)然後,您需要
/tmp/tree-copy
從文件的每一行中刪除 或任何內容;
perl -i -lpe 's{^/tmp/tree-copy/}{}' /tmp/empty-dirlist
將為此工作,或者您可以使用文本編輯器。瞧!,空目錄的列表,其中“空”被定義為“只包含目錄”。(如果您願意,您也可以將
perl
或sed
或其他內容放入管道中tee -a
。)
- 在有人指出這一點之前,文件系統掛載點不一定是這樣;某些作業系統上的文件系統管理器可以自由地使用掛載點的連結計數以供自己私人使用,因此您會經常看到掛載點目錄,無論是否為空,連結計數為
1
(在其他情況下對目錄非法)2
,或其他有意義但與其實際連結數無關的東西。因此,如果您要執行上述操作,您應該檢查您是否沒有潛在地遍歷掛載點,因為儘管不太可能,但其中一個的連結計數可能為 2。