2017-10-19 240 views
2

我正在尋找一個Linux shell的命令,它將遞歸刪除所有包含的目錄只是空的__init__.py文件和/或其他空目錄。因此,如果該目錄中的任何文件實際上至少包含一個字節,則不應將其刪除。shell命令刪除空的__init__.py文件的所有目錄

因此,換句話說,要遞歸刪除所有空的python模塊。 請注意,如果目錄包含其他內容但空init .py文件 - 它不應該被刪除。

我學到了什麼/試過到目前爲止是:

find . -type d -empty -delete 

而且

find . -type d -size -5k -delete 

而且

find . -type d -size 0 -delete 

第一個刪除目錄,而文件(在我的例子,他們包含空的初始化 .py文件。

第二個somewhy捕獲所有目錄

三不捕獲任何

+0

喜歡的東西**對於f在$(find。-name \ __ init _ \ _。py -type f -size 0); do [$(ls $ {f%/ *} | wc -l)= 1] && rm -rf $ {f%/ *};完成** – 0andriy

回答

1

它可能會用一個複雜的find命令要做到這一點,但如果你把它分解成階段,它更易於管理:

  1. 刪除空的__init__.py文件。
  2. 刪除空目錄。

如果你這樣做自下而上使用-depth然後它會自然地刪除只包含空的初始化文件和/或嵌套的空目錄的目錄。

find -depth '(' -type d -o -name __init__.py ')' -print0 | 
    while IFS= read -d '' -r path; do 
     [[ -f $path && ! -s $path ]] && (($(ls -A1 "$(dirname "$path")" | wc -l) == 1)) && rm "$path" 
     rmdir "$path" 2> /dev/null || : 
    done 

步驟:

  1. 使用-depth父母之前處理孩子。
  2. 查找目錄和__init__.py s。
  3. 循環處理每個匹配。 -print0read -d ''配對以確保我們正確處理空格和換行符的路徑。
  4. 我們匹配的唯一文件是__init__.py,所以[[ -f && ! -s ]]匹配空的init文件。 (($(ls -A1 "$(dirname "$path")" | wc -l) == 1))檢查init文件是其目錄中唯一的文件。如果兩個條件都滿足,則會刪除init文件。
  5. 嘗試rmdir的路徑。如果它是一個空目錄,它將被刪除。如果它是一個文件或非空目錄,它不會。沒關係:錯誤被2> /dev/null壓制。 || :忽略失敗的退出代碼,使其可以安全地使用set -e運行此腳本。
+0

此解決方案不起作用,因爲我不想先刪除empy __init__.py文件。 可能有目錄,其中包含一些文件+空__init__.py文件和其他東西,然後__init__將被刪除,沒有任何用途。 –

+0

更新爲還檢查'__init __。py'是其目錄中唯一的文件。 –

0

您聽起來像您已經介紹瞭如何使用您的第一個查找命令刪除空目錄。要刪除那些在他們的空文件的任何目錄,你可以使用:

find . -size 0 -exec dirname {} + | xargs rm -rf 

這裏find命令將包含空文件,然後將每個目錄下的所有目錄名稱將通過管道輸送到xargs的,這將刪除它們得到的目錄名。

如果您有__init.py__可能爲空的其他文件,那麼你可以直接指定,只有0字節的文件名爲__init.py__與匹配find命令:

find . -size 0 -and -name "__init.py__" -exec dirname {} + | xargs rm -rf 
+0

這是行不通的,因爲-size 0 doens't返回目錄 –

+0

對,我找到空文件,但是用'-exec dirname {}'得到它們所在目錄的名字,然後用管道目錄到'rm -rf' – element4lifex8

相關問題