2012-12-13 140 views
110

舊目錄我已經命名爲目錄:shell腳本刪除N天

2012-12-12 
2012-10-12 
2012-08-08 

我怎麼會刪除早於10天,一個bash shell腳本的目錄?

+0

要他們在他們的實際創建/修改時間裸露任何關係?因爲'find'可以在不查看名稱的情況下執行此操作...... – Wrikken

+0

他們應該在其上創建/修改時間 – bobsr

+3

「年齡大於」是什麼意思?你指的是創建目錄的時間,內容最後更改的時間,還是其他內容?請注意下面的一些答案; 'ctime'是inode更改時間。對於目錄,當文件被添加或從目錄中刪除時,它會改變。 – ajk

回答

262

這將做到這一點遞歸您:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \; 

說明:

  • find:查找文件/目錄/鏈接等
  • /path/to/base/dir UNIX命令:目錄開始搜索英寸
  • -type d:only f IND目錄
  • -ctime +10:只考慮修改時間的那些早於10天
  • -exec ... \;:找到的每個這樣的結果,在執行下面的命令...
  • rm -rf {}:遞歸強制刪除目錄; {}部分是查找結果從前一部分代入的位置。

另外,使用:

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf 

哪個多一點有效,因爲它相當於:

rm -rf dir1 dir2 dir3 ... 

,而不是:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ... 

-exec方法一樣。

注意:另請參閱@ MarkReed關於首選使用現代版本find的評論。

+29

使用現代版本的'find',你可以用'+'替換''',它將爲你執行'xargs'的調用,傳遞的文件數量與每個'exec'系統調用相同:''找 。 -type d -ctime +10 -exec rm -rf {} +' –

+0

感謝你們倆。我可以通過命令以某種方式傳遞父目錄。 – bobsr

+0

@bobsr查看更新後的答案:開始搜索的基本目錄被指定爲find後的第一個參數。 –

26

如果你想刪除/path/to/base下的所有子目錄,例如

/path/to/base/dir1 
/path/to/base/dir2 
/path/to/base/dir3 

,但你不想刪除根/path/to/base,你必須添加-mindepth 1-maxdepth 1選項,這將只能訪問子目錄/path/to/base

-mindepth 1從匹配中排除根/path/to/base

-maxdepth 1ONLY比賽子目錄下立即/path/to/base/path/to/base/dir1/path/to/base/dir2/path/to/base/dir3但不會列出的遞歸的方式對這些子目錄。因此這些示例子目錄將不會被列出:

/path/to/base/dir1/dir1 
/path/to/base/dir2/dir1 
/path/to/base/dir3/dir1 

等等。

因此,要刪除所有在/path/to/base之下的超過10天的子目錄;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf 
3

我掙扎着爬使用上面提供的腳本和其他一些腳本尤其是這權當文件和文件夾名稱有新行或空格。

最後偶然發現了tmpreaper,到目前爲止它已經很好地工作了。

tmpreaper -t 5d ~/Downloads 


tmpreaper --protect '*.c' -t 5h ~/my_prg 

原文出處link

有如測試,遞歸地檢查目錄,並列出它們的功能。 能夠刪除符號鏈接,文件或目錄,也是保護模式一定的模式,同時刪除

0

OR

rm -rf `find /path/to/base/dir/* -type d -mtime +10` 

更新,它的速度更快的版本:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f 
+1

這個很容易超過最大命令行長度。請參閱'xargs --show-limits'。 –

+1

如果有包含空格或其他特殊外殼字符的文件名,這也不起作用。 – Carpetsmoker

+0

@Carpetsmoker不是'-print0' /'-0'照顧特殊的外殼字符,或不是? – mpen

8

find支持-delete操作,所以:

find /base/dir/* -ctime +10 -delete; 

我認爲這些文件需要比舊版本老10多天。沒有嘗試過,有人可能會在評論中確認。

這裏投票最多的解決方案是缺少-maxdepth 0,所以它會在刪除它後爲每個子目錄調用rm -rf。這是沒有意義的,所以我建議:

find /base/dir/* -maxdepth 0 -type d -ctime +10 -exec rm -rf {} \; 

-delete解決方案中沒有使用-maxdepth 0因爲find會抱怨dir是不是空的。相反,它意味着-depth並從底部刪除。

+0

我可以確認'-delete'的作品,但正如你所說的,你只能用它來刪除空目錄,很像'rmdir'。 – CTodea