作者 主題: find 指令 刪除空目錄  (閱讀 7745 次)

0 會員 與 1 訪客 正在閱讀本文。

sidney

  • 憂鬱的高中生
  • ***
  • 文章數: 122
    • 檢視個人資料
find 指令 刪除空目錄
« 於: 2010-04-19 11:17 »
請問一下,我使用find指令要刪除空目錄,但遇到一個問題,若此資料夾是空目錄,即會把此目錄刪除掉,是否有辦法保留此目錄呢?
如:
/aa/bb
PS. /aa底下的目錄,是隨機產生的

find /aa -type d -empty | xargs rm -r 2>/dev/null;

我要刪除aa底下的空目錄,目前只要執行此指令,即會刪除bb目錄,
若是此資料夾是空目錄,即會把/aa刪除掉,

是否有辦法不要刪除/aa這一個資料夾嗎?

謝謝!

HaWay

  • 大隻佬!
  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 3980
    • 檢視個人資料
回覆: find 指令 刪除空目錄
« 回覆 #1 於: 2010-04-19 11:20 »
cd /aa
find . -type d -empty | xargs rm -r 2>/dev/null;

try it ?
我做人那麼 nice, 肯定有什麼誤會.....

sidney

  • 憂鬱的高中生
  • ***
  • 文章數: 122
    • 檢視個人資料
回覆: find 指令 刪除空目錄
« 回覆 #2 於: 2010-04-19 11:25 »
果然是博士,應該是這樣子寫~
find /aa/. -type d -empty | xargs rm -r 2>/dev/null;

謝謝啦!

wenlien

  • 憂鬱的高中生
  • ***
  • 文章數: 119
  • 性別: 男
    • 檢視個人資料
    • Open or not open, that is the stupid question.
回覆: find 指令 刪除空目錄
« 回覆 #3 於: 2010-04-19 14:42 »
請問一下,我使用find指令要刪除空目錄,但遇到一個問題,若此資料夾是空目錄,即會把此目錄刪除掉,是否有辦法保留此目錄呢?
如:
/aa/bb
PS. /aa底下的目錄,是隨機產生的

find /aa -type d -empty | xargs rm -r 2>/dev/null;

我要刪除aa底下的空目錄,目前只要執行此指令,即會刪除bb目錄,
若是此資料夾是空目錄,即會把/aa刪除掉,

是否有辦法不要刪除/aa這一個資料夾嗎?

謝謝!
請教一下,為何rm要加"-r" ?
如果要砍空目錄,為何不用 rmdir /aa/* /aa/.*

regards,

Stanley Huang

gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
回覆: find 指令 刪除空目錄
« 回覆 #4 於: 2010-04-19 16:34 »
果然是博士,應該是這樣子寫~
find /aa/. -type d -empty | xargs rm -r 2>/dev/null;

謝謝啦!


你如果目錄下有好幾層目錄,就要這麼寫
find aa/.  -depth -type d -empty  -exec rmdir {} \;

sidney

  • 憂鬱的高中生
  • ***
  • 文章數: 122
    • 檢視個人資料
回覆: find 指令 刪除空目錄
« 回覆 #5 於: 2010-04-20 09:10 »
Q:請教一下,為何rm要加"-r" ?
因為加-r才可以刪目錄呀!

Q:如果要砍空目錄,為何不用 rmdir /aa/* /aa/.*
因為此目錄底下,不一定是全部空目錄呀!
若有一些有資料,是不是就全刪掉了呢?
謝謝!

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: find 指令 刪除空目錄
« 回覆 #6 於: 2010-04-20 13:29 »
Q:請教一下,為何rm要加"-r" ?
因為加-r才可以刪目錄呀!

你可能有蠻大的誤解。

rm 配合 -r 是說,若是指定目的是目錄,會用遞迴方式刪除該目錄與其下所有的目錄與檔案。所以這個與你需求根本不一樣。

引用
Q:如果要砍空目錄,為何不用 rmdir /aa/* /aa/.*
因為此目錄底下,不一定是全部空目錄呀!
若有一些有資料,是不是就全刪掉了呢?
謝謝!

rmdir 只會刪除空目錄而已.

遞迴方式處理就好

代碼: [選擇]
while true; do
  find /path -type d -empty -print0 | xargs -0 rmdir
  code=$?
   [ "$code" -ne 0 ] && break
done
« 上次編輯: 2010-04-20 13:56 由 kenduest »
I am kenduest - 小州

my website: http://kenduest.sayya.org/

wenlien

  • 憂鬱的高中生
  • ***
  • 文章數: 119
  • 性別: 男
    • 檢視個人資料
    • Open or not open, that is the stupid question.
回覆: find 指令 刪除空目錄
« 回覆 #7 於: 2010-04-20 15:40 »
Q:請教一下,為何rm要加"-r" ?
因為加-r才可以刪目錄呀!

你可能有蠻大的誤解。

rm 配合 -r 是說,若是指定目的是目錄,會用遞迴方式刪除該目錄與其下所有的目錄與檔案。所以這個與你需求根本不一樣。

引用
Q:如果要砍空目錄,為何不用 rmdir /aa/* /aa/.*
因為此目錄底下,不一定是全部空目錄呀!
若有一些有資料,是不是就全刪掉了呢?
謝謝!

rmdir 只會刪除空目錄而已.

遞迴方式處理就好

代碼: [選擇]
while true; do
  find /path -type d -empty -print0 | xargs -0 rmdir
  code=$?
   [ "$code" -ne 0 ] && break
done

假設樓主的目的是將全部的空目錄都砍掉 (也包含當子目錄被刪掉時, 本身也即便成為空目錄)
ex.
/dir1
  --./dir2
    --./dir3
      --./dir4
  --file1
刪除完後應變為:
/dir1
  --file1
我覺得最簡單的方法是:
find / -type d | sort -r | xargs -0 rmdir
regards,

Stanley Huang

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: find 指令 刪除空目錄
« 回覆 #8 於: 2010-04-20 17:18 »

回 sidney

代碼: [選擇]
find / -type d | sort -r | xargs -0 rmdir
xargs 搭配 -0 那是因為有 find 配合 -print0。所以目前沒使用 -print0 時候就無法這樣使用。

會用 -0 是考慮目錄名稱有特殊字元與空白,而若是沒有的話就還好。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

wenlien

  • 憂鬱的高中生
  • ***
  • 文章數: 119
  • 性別: 男
    • 檢視個人資料
    • Open or not open, that is the stupid question.
回覆: find 指令 刪除空目錄
« 回覆 #9 於: 2010-04-21 11:22 »
Q:請教一下,為何rm要加"-r" ?
因為加-r才可以刪目錄呀!

你可能有蠻大的誤解。

rm 配合 -r 是說,若是指定目的是目錄,會用遞迴方式刪除該目錄與其下所有的目錄與檔案。所以這個與你需求根本不一樣。

引用
Q:如果要砍空目錄,為何不用 rmdir /aa/* /aa/.*
因為此目錄底下,不一定是全部空目錄呀!
若有一些有資料,是不是就全刪掉了呢?
謝謝!

rmdir 只會刪除空目錄而已.

遞迴方式處理就好

代碼: [選擇]
while true; do
  find /path -type d -empty -print0 | xargs -0 rmdir
  code=$?
   [ "$code" -ne 0 ] && break
done

假設樓主的目的是將全部的空目錄都砍掉 (也包含當子目錄被刪掉時, 本身也即便成為空目錄)
ex.
/dir1
  --./dir2
    --./dir3
      --./dir4
  --file1
刪除完後應變為:
/dir1
  --file1
我覺得最簡單的方法是:
find / -type d | sort -r | xargs -0 rmdir


最後上一行指令key 錯了, should be:
find /dir1 -type d | sort -r | xargs rmdir > /dev/null 2>&1 ## 再補上將all messages丟到/dev/null中
如果file name有特殊字元與空白, 就如同kenduest大大說的,那就不能這樣做了...
regards,

Stanley Huang

gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
回覆: find 指令 刪除空目錄
« 回覆 #10 於: 2010-04-21 15:39 »
為什麼不用我的方法,我試過是 ok 的啊,才一行。

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: find 指令 刪除空目錄
« 回覆 #11 於: 2010-04-21 15:53 »
為什麼不用我的方法,我試過是 ok 的啊,才一行。

你的答案無法一次全部刪除所有的多個空目錄啊。

考慮一下多層目錄的情況。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
回覆: find 指令 刪除空目錄
« 回覆 #12 於: 2010-04-21 17:28 »
為什麼不用我的方法,我試過是 ok 的啊,才一行。

你的答案無法一次全部刪除所有的多個空目錄啊。
考慮一下多層目錄的情況。

我試過可以的,是我們的 find 版本不同嗎?


kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: find 指令 刪除空目錄
« 回覆 #13 於: 2010-04-21 17:44 »
我試過可以的,是我們的 find 版本不同嗎?

不好意思... 你多了一個 depth 參數,我漏看了... 這樣用的確可以的。不過速度上慢了一點。

我那個版本跑起來會快一點,因為 xargs 可以一次帶入比較多的目錄名稱,所以 rmdir 呼叫次數比較少。

不過目前版本,find 都支援 -delete 參數,所以這樣用更好:

代碼: [選擇]
find /path -type d -empty -delete
其中目錄建立方式:

代碼: [選擇]
mkdir -p test/{1..10}/{1..10}/{1..10}{1..10}
I am kenduest - 小州

my website: http://kenduest.sayya.org/