Bash命令从目录中删除除一个文件之外的所有文件

时间:2011-02-13 15:28:22

标签: bash

我有一个备份文件夹,其中包含多个MySQL备份,其中包含从备份时间派生的标准文件名:

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

是否有单行bash命令会删除除最新备份之外的所有备份?

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:1)

如果您启用了extglob选项:

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