2011-02-13 74 views
0

我有一個包含有標準的文件名多個MySQL備份時從備份所需的時間導出的備份文件夾中刪除所有,但一個文件:bash命令從目錄

Jims-MBP-2:manual-1 jim$ ls -1 
site-name-2011-02-12T19-04-13.mysql 
site-name-2011-02-12T19-11-58.mysql 
site-name-2011-02-12T19-22-50.mysql 
site-name-2011-02-12T19-24-46.mysql 
site-name-2011-02-13T14-30-42.mysql 

是否有單line bash命令會刪除最近備份以外的所有文件?

回答

3
ls | grep -v $(ls -t | head -1) | xargs rm 

更好:

ls -rt | tail -n +2 | xargs rm 

裝甲對抗瘋狂的文件名,適合由偏執狂(除了那些在新行的一切):

ls -rt | tail -n +2 | tr '\n' '\0' | xargs -0 rm 
+1

不要再分析`ls`輸出...... – Juliano 2011-02-13 17:05:42

+2

@Juliano:解析ls絕對沒問題。擔心換行符和其他怪異字符的文件名是完全和徹底浪費時間。 – 2011-02-13 21:38:38

1

如果已經啓用extglob選項:

rm !(`ls -1 site-name-*.mysql | sort -r | head -1`) 
+0

這工作正常,當我從bash提示符運行它,但是當我從一個bash腳本中運行它時,我得到以下錯誤消息 - 第52行:語法錯誤附近意想不到的標記`(' - 任何想法如何我可以解決這個? – Jim 2011-02-13 16:47:47

3
#!/bin/bash 
shopt -s extglob 
files='sitename*.mysql' 
newest=($files) 
for f in $files 
do 
    if [[ "$f" -nt "$newest" ]] 
    then 
     newest=$f 
    fi 
done 
echo rm !("$newest") 

您應該avoid parsing ls