2009-08-14 122 views
21

我試圖做一些這可能是很簡單的,我有一個目錄結構,如:刪除所有文件,但將所有目錄保存在bash腳本中?

dir/ 
    subdir1/ 
    subdir2/ 
     file1 
     file2 
     subsubdir1/ 
      file3 

我想運行在bash腳本的命令,將dir命令遞歸地刪除所有文件向下,但保留所有目錄。即:

dir/ 
    subdir1/ 
    subdir2/ 
     subsubdir1 

這將是一個合適的命令?

+0

看起來更像是一個超級用戶的問題對我來說,你不覺得嗎? – 2009-08-14 22:09:23

+4

不,我寫了一個bash腳本,這是編程,並且在這個網站上有很多bash腳本問題:-) – Grundlefleck 2009-08-14 22:11:35

+4

shell腳本算作編程,在我看來 – 2009-08-14 22:12:04

回答

38
find dir -type f -print0 | xargs -0 rm 

find列表中匹配一個給定的目錄中的部分表達的是,遞歸的所有文件。 -type f符合普通文件。 -print0用於使用\0作爲分隔符打印出名稱(因爲任何其他字符(包括\n)可能都在路徑名中)。 xargs用於從標準輸入中收集文件名並將它們作爲參數。 -0是爲了確保xargs會理解\0分隔符。

xargs如果參數列表變得太大,就足夠明智地多次調用rm。所以它比嘗試打電話要好得多。如rm $((find ...)。而且它比單獨爲每個文件調用rm要快得多,如find ... -exec rm \{\}

+0

+1,測試結果不錯:-) – Grundlefleck 2009-08-14 22:09:44

+0

+1用於處理文件名中的空格和其他「意外」字符。 – chepner 2012-02-14 14:35:16

8
find dir -type f -exec rm {} \; 

其中DIR是你想從

注意刪除文件,如果你想刪除的一切,這隻會刪除常規文件,而不是符號鏈接,而不是設備等頂級除了目錄,使用

find dir -not -type d -exec rm {} \; 
+0

+1,測試良好:) – Grundlefleck 2009-08-14 22:08:48

+0

+1。我添加了引號,因爲它們在處理包含空格的文件名時非常重要。 – Stephan202 2009-08-14 22:11:45

+0

@ Stephan202這是不正確的。就shell而言''{}''和'{}'是一樣的,'find'在shell將命令行參數傳遞給'find'之前刪除了引號。 – 2009-08-14 22:27:25

8
find dir -type f -exec rm '{}' + 
+1

'+'是什麼? – Grundlefleck 2009-08-14 22:31:30

+3

'-exec'命令可以通過兩種方式終止:使用分號或加號。如果使用分號,則會爲每個文件生成一個新進程。如果您使用加號,則只會生成一個進程。 (實際上,如果命令行變得太長,那麼會產生多個進程 - 基本上,它的工作方式與'xargs'相似,但沒有所有引用問題。)說,有兩個文件,稱爲A和B.然後,用分號會產生兩個過程:'rm A'和'rm B'。使用plus,只會產生一個進程:'rm A B'。 – 2009-08-14 22:52:52

9

隨着GNU的find可以使用-delete行動:

find dir -type f -delete 

使用標準find您可以使用-exec rm

find dir -type f -exec rm {} + 
+0

爲-delete標誌+1 – Christoffer 2009-08-21 10:26:00

相關問題