用于删除目录中除最新N之外的旧文件的脚本

时间:2011-02-03 16:07:05

标签: bash

我想编写一个脚本来清理旧文件中的备份目录,只留下最新的N.我也想在不使用ls的情况下这样做。

昨天我最终得到了以下代码:

counter=0
while IFS=/ read -rd '' time file; do

        ((counter++ < ${KEEP_NUMBER:?})) && continue
        rm -f "$file"

done < <(find . -maxdepth 1 -type f -printf "%T@/%p\0" | sort -znr)

然而,这根本不可移植,因为使用了find -printf,留下了没有GNU扩展的所有框。

有没有更好的方法来完成这项任务?

3 个答案:

答案 0 :(得分:1)

只要你有

,就可以相对容易地完成
  • 支持数组的shell(如bash所有)
  • 访问test(可以比较2个文件的年龄)

这是我的尝试(它可能无法处理文件名中的空格,但可以很容易地修复

#!/bin/bash

declare -a files
for file in *
do
    files[${#files[@]}]=$file
done

# Bubble sort the files from newest to oldest
declare -i i j count=${#files[@]}
while true
do
    declare -i sorted=1
    for ((i=1;i<count;i++))
    do
        let j=i-1
        if [ ${files[$j]} -ot ${files[$i]} ]
        then
            sorted=0
            f=${files[$j]}
            files[$j]=${files[$i]}
            files[$i]=$f
        fi
    done
    [ $sorted -eq 1 ] && break
done

# Delete everything except the first 5 files
for ((i=5;i<count;i++))
do
    rm "${files[$i]}"
done

答案 1 :(得分:0)

嗯,-newer的主要POSIX find。它 - 通过一些次要编码 - 可用于按修改时间分隔文件。我会做一些事情,比如拿第一个文件,找到更新的文件。我有两套 - 更新,更老。如果有比 N 更新的文件,我只重复较新设置的过程,否则我记得较新的设置,从N中减去这个数字并重复旧设置的过程。

或者您可以使用pax创建存档,然后使用-o listopt以您想要的格式提取修改时间,您可以获得所有信息:)

答案 2 :(得分:0)

http://www.google.fr/search?q=zfs

其他......

man rsnapshoot

其他......

停止尝试重新发明备份套件

其他......

男人找到| grep - -ctime 男人找到| grep - -delete