首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除目录中除最新N之外的旧文件的脚本

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

Stack Overflow用户
提问于 2011-02-04 00:07:05
回答 3查看 1.2K关注 0票数 1

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

昨天我用下面的代码结束了:

代码语言:javascript
运行
复制
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扩展的盒子。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-04 11:16:11

它可以相对容易地完成,只要你有

  • 支持阵列(如bash )的shell
  • Access to test (可比较2个文件的时间)

下面是我的尝试(它可能不能处理文件名中的空格,但这可以很容易地解决

代码语言:javascript
运行
复制
#!/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
EN

Stack Overflow用户

发布于 2011-02-04 16:34:35

好的,这是find的POSIX -newer的主要功能。它-通过一些次要的编码-可以用来根据文件的修改时间来分隔文件。我会做一些事情,比如获取第一个文件,找到较新的文件。我有两套--新的和旧的。如果有比N更新的文件,我只对较新的集合重复该过程,否则我会记住较新的集合,从N中减去这个数字,然后对较旧的集合重复该过程。

或者,您可以使用pax创建一个归档文件,然后使用-o listopt以您想要的格式提取修改时间,这样您就拥有了所有信息:)

票数 0
EN

Stack Overflow用户

发布于 2011-03-20 21:57:39

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

否则..。

man rsnapshoot

否则..。

不要试图重新创建备份套件

否则..。

man find | grep -ctime man find | grep -delete

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4888508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档