2011-02-13 77 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