2011-05-16 42 views
7

我有一個包含我的應用程序版本的文件夾,每當我上傳新版本時爲其創建一個新的子文件夾,子文件夾名稱爲當前時間戳,這裏是所使用的主文件夾的打印輸出(ls -l命令| grep的^ d):Linux - 僅保存最近的10個文件夾並刪除其餘的文件夾

drwxrwxr-x 7 root root 4096 2011-03-31 16:18 20110331161649 
drwxrwxr-x 7 root root 4096 2011-03-31 16:21 20110331161914 
drwxrwxr-x 7 root root 4096 2011-03-31 16:53 20110331165035 
drwxrwxr-x 7 root root 4096 2011-03-31 16:59 20110331165712 
drwxrwxr-x 7 root root 4096 2011-04-03 20:18 20110403201607 
drwxrwxr-x 7 root root 4096 2011-04-03 20:38 20110403203613 
drwxrwxr-x 7 root root 4096 2011-04-04 14:39 20110405143725 
drwxrwxr-x 7 root root 4096 2011-04-06 15:24 20110406151805 
drwxrwxr-x 7 root root 4096 2011-04-06 15:36 20110406153157 
drwxrwxr-x 7 root root 4096 2011-04-06 16:02 20110406155913 
drwxrwxr-x 7 root root 4096 2011-04-10 21:10 20110410210928 
drwxrwxr-x 7 root root 4096 2011-04-10 21:50 20110410214939 
drwxrwxr-x 7 root root 4096 2011-04-10 22:15 20110410221414 
drwxrwxr-x 7 root root 4096 2011-04-11 22:19 20110411221810 
drwxrwxr-x 7 root root 4096 2011-05-01 21:30 20110501212953 
drwxrwxr-x 7 root root 4096 2011-05-01 23:02 201105
drwxrwxr-x 7 root root 4096 2011-05-03 21:57 20110503215252 
drwxrwxr-x 7 root root 4096 2011-05-06 16:17 20110506161546 
drwxrwxr-x 7 root root 4096 2011-05-11 10:00 20110511095709 
drwxrwxr-x 7 root root 4096 2011-05-11 10:13 20110511100938 
drwxrwxr-x 7 root root 4096 2011-05-12 14:34 20110512143143 
drwxrwxr-x 7 root root 4096 2011-05-13 22:13 20110513220824 
drwxrwxr-x 7 root root 4096 2011-05-14 22:26 20110514222548 
drwxrwxr-x 7 root root 4096 2011-05-14 23:03 20110514230258 

我正在尋找一個命令,會留下最後的10個版本(子文件夾),並刪除休息。

有什麼想法?

回答

23

你去那裏。 (編輯)近日

ls -dt */ | tail -n +11 | xargs rm -rf

首先列出目錄修改,然後採取所有的人,除了第10位,然後將它們發送到rm -rf

+0

即時通訊:rm:無法刪除目錄:'。' – Ran 2011-05-16 22:27:39

+3

哇!首先,'ls -dt'只輸出'.'。其次,如果你將它改正爲'ls -t',那麼你將刪除10個最新的文件,這與所要求的完全相反。第三,如果除了所考慮的目錄之外還有其他文件,你的腳本會很樂意刪除隨機的東西。第四,如果有「奇怪的」文件名,你的腳本可以做任何事情,因爲你正在解析'ls'的輸出,[不是一個好主意](http://mywiki.wooledge.org/ParsingLs),您將準備好的輸入傳遞給['xargs'](http://linux.die.net/man/1/xargs)。 – Gilles 2011-05-16 22:30:33

+0

等一下我已經注意到,你想先離開第一個10,並刪除所有其他人,我認爲你需要刪除第一個10.嗯你的錯誤是有趣的。 – 2011-05-16 22:31:18

0

編輯:

find . -maxdepth 1 -type d ! -name \\.| sort | tac | sed -e '1,10d' | xargs rm -rf 
+0

我覺得應該是:ls -l命令| grep^d | tac | sed -e'1,10d'| xargs rm -rf – Ran 2011-05-16 22:30:42

+1

你正在解析'ls'的輸出,[不是一個好主意](http://mywiki.wooledge.org/ParsingLs),並且你將準備好的輸入傳遞給['xargs']( http://linux.die.net/man/1/xargs)。你的'grep^d'沒有做你認爲它正在做的事 - 如果你有'ls -l',你需要提取文件名(不是一個好主意),但是因爲你沒有,所以沒有目錄指示符。 – Gilles 2011-05-16 22:33:28

+0

是的,那是垃圾。我的錯。 – linuts 2011-05-16 23:05:13

-2

您的目錄名稱按時間順序排序,這使得這很容易。時間順序的目錄列表只是*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]更準確。所以你想刪除除最後10個之外的所有內容。

set [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ 
while [ $# -gt 10 ]; do 
    rm -rf "$1" 
    shift 
fi 

(雖然有超過10名的目錄離開,刪除最早的一個。)

1
ls -lt | grep ^d | sed -e '1,10d' | awk '{sub(/.* /, ""); print }' | xargs rm -rf 

說明:

  • 列表按時間順序排列當前目錄中的所有內容(最新文件先)
  • 過濾掉所有的目錄
  • 忽略第10個線/目錄
  • 使用awk來提取剩餘的文件名「的ls -l」輸出

  • 刪除文件

2
ls -dt1 /path/to/folder/*/ | sed '11,$p' | rm -r 

這個假定只有這些目錄和不其他人出現在工作目錄中。

  • ls -dt1通常只打印最新的目錄然而/*/將 只匹配目錄和打印他們的完整路徑的1確保每場比賽一個 線/上市t時間排序在頂部最新。

  • sed將第11行放到底部並僅打印這些行,然後將其傳遞到rm

您可以使用xargs的,但測試你可能希望刪除| rm -r,看看目錄列出正確第一。

1

如果目錄名包含日期可以刪除所有,但最近10個目錄使用默認字母排序

ls -d */ | head -n -10 | xargs rm -rf 
相關問題