2017-08-09 52 views
0

我的應用程序日誌將在linux系統下面的文件夾中創建。shell腳本刪除不同文件夾中最後更新文件以外的所有文件

Folder 1: 100001_1001 
folder 2 : 200001_1002 
folder 3 :300061_1003 
folder 4: 300001_1004 
folder 5 :400011_1008 

要刪除除上述文件夾中的最新文件中的所有文件,並要添加這cron作業。

我想下面一個沒有工作需要幫助

30 1 * * * ls -lt /abc/cde/etc/100* | awk '{if(NR!=1) print $9}' | xargs -i rm -rf {} \; 
30 1 * * * ls -lt /abc/cde/etc/200* | awk '{if(NR!=1) print $9}' | xargs -i rm -rf {} \; 
30 1 * * * ls -lt /abc/cde/etc/300* | awk '{if(NR!=1) print $9}' | xargs -i rm -rf {} \; 
30 1 * * * ls -lt /abc/cde/etc/400* | awk '{if(NR!=1) print $9}' | xargs -i rm -rf {} \; 
+0

是'200001_1002'文件名? – anubhava

+0

當你不從cron運行它們時,這些命令會做什麼?做單獨的部分(管道之間的東西)做你認爲他們做的事情嗎? – tink

+0

200001_1002是dir的名字,都是dir的,在dir裏面有很多zip文件。想要刪除除最新版本之外的所有.zip文件。 – user1206219

回答

0

您可以使用這條管道由所有的GNU工具(這樣我們也能處理包含特殊字符,空格和水珠字符的文件路徑)

find /parent/log/dir -type f -name '*.zip' -printf '%[email protected]\t%p\0' | 
sort -zk1,1rn | 
cut -zf2 | 
tail -z -n +2 | 
xargs -0 rm -f 
0

使用稍加修改的方法來自己:

find /abc/cde/etc/100* -printf "%A+\t%p\n" | sort -k1,1r| awk 'NR!=1{print $2}' | xargs -i rm "{}" 

查找版本不會缺少路徑,所以這可能是工作的(我不知道任何關於目錄結構,以及是否在目錄,文件或一組文件中有100 *個點...

+0

這個100 *是以100開頭並且裏面有很多文件的目錄列表 – user1206219

+0

我的方法適合你嗎?無論是模仿你的目錄結構,還是使用「echo rm」而不是「rm」來對付/ usr/share/man/pl/man *,它似乎在我的系統上做了「正確的事情」...... @ user1206219 – tink

0

您應該使用find。它有一個-delete操作,刪除找到的與您的規格匹配的文件。 警告:使用-delete很容易出錯。首先測試你的命令。例如,要查找下a/b/c(只有文件)命名*.zip所有文件:

find a/b/c -depth -name '*.zip' -type f -print 

這是測試,將打印,最後的命令將刪除所有文件(不要忘了-depth,這一點很重要) 。一旦你確信,那不刪除命令是:

find a/b/c -depth -name '*.zip' -type f -delete 

find也有一些選項可以選擇由最後修改日期的文件,按大小...你可以,例如,發現修改過的所有文件至少24小時前:

find a/b/c -depth -type f -mtime +0 -print 

,並經過仔細檢查,刪除它們:

find a/b/c -depth -type f -mtime +0 -delete 
相關問題