2010-11-08 60 views
19

可能重複:
Delete all but the most recent X files in bashbash命令刪除所有,但最後5個目錄

我有一個腳本每天創建增量備份,我需要刪除所有備份,但最後5。

例如,我有這個文件夾:

 
drwxr-xr-x 4 root root 4096 Oct 29 01:10 2010-10-29 
drwxr-xr-x 4 root root 4096 Oct 30 01:10 2010-10-30 
drwxr-xr-x 4 root root 4096 Oct 31 01:10 2010-10-31 
drwxr-xr-x 4 root root 4096 Nov 1 01:10 2010-11-01 
drwxr-xr-x 4 root root 4096 Nov 2 01:10 2010-11-02 
drwxr-xr-x 4 root root 4096 Nov 3 01:10 2010-11-03 
drwxr-xr-x 4 root root 4096 Nov 4 01:10 2010-11-04 
drwxr-xr-x 4 root root 4096 Nov 5 01:10 2010-11-05 
drwxr-xr-x 4 root root 4096 Nov 6 01:10 2010-11-06 
drwxr-xr-x 4 root root 4096 Nov 7 01:10 2010-11-07 
drwxr-xr-x 4 root root 4096 Nov 8 01:10 2010-11-08 

而我只需要維護最後5個目錄並刪除其他目錄。命令執行後,我需要有僅此:

 
drwxr-xr-x 4 root root 4096 Nov 4 01:10 2010-11-04 
drwxr-xr-x 4 root root 4096 Nov 5 01:10 2010-11-05 
drwxr-xr-x 4 root root 4096 Nov 6 01:10 2010-11-06 
drwxr-xr-x 4 root root 4096 Nov 7 01:10 2010-11-07 
drwxr-xr-x 4 root root 4096 Nov 8 01:10 2010-11-08 

我不需要刪除以前的5天,我需要刪除所有除最後5個目錄:)

現在我使用:

find /backup/increment -maxdepth 1 -type d -mtime +5 -exec rm -rf {} \;

但我需要改善不是基於時間:)

編輯:這是整天進行備份的服務器的示例,但我需要一個腳本來刪除最後5個之前的所有文件夾,因爲我的計算機在晚上以00:10執行備份,但不是所有晚上的備份都完成了,因爲我的電腦壞了所有的日子,我需要總是最後5個備份:)

+0

如果它不是「基於時間」,什麼是你的「最後5」的定義? – 2010-11-08 18:50:34

+0

@dogbane謝謝,但@MartinStettner解決方案似乎是更優雅的解決方案:) – Lito 2010-11-09 09:40:26

+0

@David在主帖中添加了評論。 – Lito 2010-11-09 13:23:54

回答

32

使用tail打印命令行開始與ñ日線(選件-n +N):

rm `ls -t | tail -n +6` 

ls -t輸出按時間排序的當前目錄。 tail -n +6以第6行開始。使用反引號引用將管道的結果輸入rm命令。

OLD SOLUTION,不正確...

使用head命令,打印第一Ñ線一些輸出的:

rm `ls -t1 | head -n 5` 

ls -t輸出按時間排序當前目錄。 head -n 5取前一個輸出的前五個條目。使用反引號引用將管道的結果輸入rm命令。

請嘗試首先將實時數據:)之前...

+1

你想要使用尾部,而不是*最後* n行。但是,這個解決方案比我的更簡單,更好。 :) – 2010-11-08 19:06:20

+1

那怎麼樣:'rm $(ls | sort -r | sed 1,5d)';按日期順序列出名稱;將它們按相反順序排序(最近的第一個);刪除前五行;刪除剩下的東西。 – 2010-11-08 19:27:06

+0

@Max:謝謝你指出我的錯誤。幸運的是,「tail」有+ N選項(我不知道),所以我們可以得到所有行*,但是第一個n *。 – MartinStettner 2010-11-09 03:06:22

0

創建開始和結束日期

touch -t 1010290000 before 
touch -t 2011042359 after 

找到所有的2間文件的兩個空文件虛擬文件和「rm -rf」結果

find . -newer before \! -newer after -exec rm -rf {} \; 
+0

更優雅的解決方案嗎? :) – Lito 2010-11-08 18:45:09

+0

該解決方案將不會基於日期/時間:) – Lito 2010-11-08 18:46:06

1

第一件事是 在我心裏。它不是優雅的:

a=0; 
for i in `ls -t`; 
do 
    a=`expr $a + 1`; 
    if [ $a -gt 5 ]; then 
      echo "removing $i"; 
      rm -rf $i 
    fi; 
done 
+0

它不是優雅的,但它是一個可能的解決方案:) – Lito 2010-11-08 18:54:43

0

ls -tr | perl -ne'{@files = <>; print @files [0 .. $#files-5]}'| xargs -n1 echo rm -rf

您將在rm -rf之前刪除回顯以使其工作。

0

這個技巧將是ls的-t選項,按修改時間從最新到最舊排序。

一個非常天真的解決方案,使用臨時文件,可能會走這條路:

ls -t > /tmp/file_list 
num_files_to_keep=5 
# wc -l gets the line count of a file 
# first word of wc output is the actual line count, and that's all we need, so 
# delete everything after the space. 
num_files=`wc -l /tmp/file_list | sed "s/ .*//"` 
#if appropriate you should add a check for num_files < num_files_to_keep 
num_files_to_delete=$(($num_files - $num_files_to_keep)) 
rm `tail -n $num_files_to_delete /tmp/file_list` 
相關問題