2014-10-20 105 views
0

是否有一些優雅/簡單的方式來刪除文件夾的內容,這種方式沒有錯誤輸出,如果它是空的?在bash中截斷一個目錄

下面的命令,如果該目錄是空的,在這種情況下

$ rm -r $dir/* 

不起作用,因爲,在wilcard *沒有展開,你會得到一個錯誤,指出rm找不到文件*

當然,標準的方法是檢查它是否爲空(使用ls $dir | wc -wfind $dir -link 2或任何其他相關命令),否則刪除其內容。

是否有其他方法不檢查文件夾內容,而只是「截斷」目錄呢?

回答

5

猛砸

簡單,

$ rm -rf dir/* 

(默認情況下,我相信)猛砸不抱怨沒有找到任何與glob相關的東西。

$ echo dir/* 
dir/* 

rm沒有找到有文字的glob字符的文件名,它抱怨找不到它被要求刪除的文件:

$ rm "dir/*" 
rm: cannot remove ‘dir/*’: No such file or directory 
$ echo $? 
1 
它只是通過給你的命令傳遞你的文字水珠

但是,如果你強迫它,它不會抱怨:

$ rm -f "dir/*" 
$ echo $? 
0 

我不知道這是否副歌 - 從 - 抱怨是POSIX。

但是,請注意,如果您沒有設置shell選項「dotglob」,則會漏掉以點開頭的文件,也就是「hidden」文件。

一般

巖組不通過默認傳遞文字水珠。你必須要求「set -o nonomatch」。

$ echo dir/* 
zsh: no matches found: dir/* 
$ echo $? 
1 
$ set -o nonomatch 
$ echo dir/* 
dir/* 

出於兼容性考慮,我不會用上面的現代猛砸專用「rm -rf dir/*」,但將使用更普遍的,廣泛兼容的解決方案:

$ find dir -mindepth 1 -delete 

查找所有文件「目錄「的最小深度爲1(」目錄「本身在深度爲0),並刪除它們。

3

您可以使用rm -rf

rm -rf "$dir"/* 

man bash

-f, --force 
      ignore nonexistent files and arguments, never prompt 
+1

...我提出的問題太快了。明顯的解決方案。謝謝。 – 2014-10-20 17:50:14