2012-01-13 127 views
1

我正在嘗試編寫一個shell腳本來刪除給定目錄中的所有子目錄。我知道有一個相同的簡單方法。 像這樣在bash中刪除給定文件夾中的所有目錄

find ./ -type d -exec rm -r {} \;
但自從我學習shell腳本,所以我更喜歡寫相同的腳本。這裏是我的方法

for i in `ls ./*`; do 
if [ -d $i ];then 
rm -r $i 
fi 
done 

當我運行此腳本,這給了我下面的錯誤

RM:不能刪除目錄:`「。

給這個錯誤this stops.So什麼是我的方法中的錯誤。據我瞭解,空白名稱應該產生一些問題。但是這個劇本並沒有走得那麼遠。

回答

7

ls ./*列出了每個直接子目錄中的所有文件。 -d然後檢查文件的名稱,但好像它在。而不是它來自的子目錄。

例如,如果您有:

foo1/ 
    bar 
foo2/ 
    baz 

那麼LS ./*會使得酒吧和巴茲的名單,因爲./*將匹配foo1和foo2的,然後將LS列出每個內容這兩個目錄。

您得到的錯誤信息可能是因爲您的ls已被別名爲'ls -a'列出。和..弗洛林的答案說,你可以用ls -A ./*來避免這個問題。 。

如果你只是想刪除的目錄中,只是做:

for i in `ls -A`; do if [ -d $i ]; then rm -r $i; fi; done 
+0

+1表示ls ./*會列出子目錄中的內容。 – 2012-01-13 09:49:57

0

問題是ls命令列表鏈接當前文件夾和父文件夾。所以你必須測試你的i變量是否設置爲'。'或 '..'

if [ -d $i ] -a [ $i != '.' ] -a [ $i != '..' ] 
then 
rm -r $i 
fi 
3

...不應該出現在ls輸出。

但是,你可以用

ls -A 

測試(-A的意思是 '幾乎所有'

-a意味着 '所有')

和:你爲什麼不強制使用for i in 'ls'

+0

我不清晰理查德解釋道。 – 2012-01-13 10:09:11

3

You shouldn't use ls此命令。有一個很簡單的方法,以確保你只遍歷目錄:

for dir in */ 
do 
    echo "$dir" 
done 
+0

僅供參考,您也可以在/ tmp/foo/* /中執行dir命令。做...' – Eldelshell 2016-04-11 16:22:50

0

*/」應該匹配所有子目錄

嘗試是這樣的:

rm -rf /path/to/mySubfolder/*/

相關問題