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

Bash 用于删除目录中除最新文件以外的旧文件的脚本N,bash,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@

我想写一个脚本,从旧文件中清除备份目录,只留下最新的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)
计数器=0
而IFS=/read-rd''时间文件;做
((计数器++<${KEEP_NUMBER:?}))&继续(&C)
rm-f“$file”

完成<如果您有

  • 支持数组的shell(正如bash所做的那样)
  • 访问
    测试
    (可以比较两个文件的使用期限)
这是我的尝试(它可能无法处理文件名中的空格,但可以很容易地修复)

#!/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
!/bin/bash
声明-a文件
存档*
做
文件[${#文件[@]}]=$file
完成
#气泡将文件从最新到最旧排序
declare-i j count=${#files[@]}
虽然是真的
做
declare-i=1

对于((i=1;i可以相对容易地完成,前提是您

  • 支持数组的shell(正如bash所做的那样)
  • 访问
    测试
    (可以比较两个文件的使用期限)
这是我的尝试(它可能无法处理文件名中的空格,但可以很容易地修复)

#!/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
!/bin/bash
声明-a文件
存档*
做
文件[${#文件[@]}]=$file
完成
#气泡将文件从最新到最旧排序
declare-i j count=${#files[@]}
虽然是真的
做
declare-i=1

为了((i=1;i好的,
find
的主文件中有POSIX
-更新的
。它-加上一些次要的编码-可以根据文件的修改时间来分隔文件。我会做一些事情,比如取第一个文件,找到更新的文件。在那里,我有两组文件-更新的和旧的。如果有比N更多的新文件,我会只对较新的集合重复这个过程,否则我会记住较新的集合,从N中减去这个数字,然后对较旧的集合重复这个过程


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

好吧,有一个POSIX
-较新的
主要用于
查找
。它-通过一些次要的编码-可以根据文件的修改时间来分隔文件。我会做一些事情,比如获取第一个文件,查找较新的文件。在这里,我有两个集-较新的和较旧的。如果有比N更多的较新文件,我将被删除只对较新的集合重复这个过程,否则我会记住较新的集合,从N中减去这个数字,然后对较旧的集合重复这个过程

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

否则

人字枪

否则

停止尝试重新设计备份套件

否则

男人找| grep--ctime 男人发现| grep---删除

否则

人字枪

否则

停止尝试重新设计备份套件

否则

男人找| grep--ctime
man find | grep--delete

由于
ls
是查看文件时间的唯一标准工具,如果不进入特定于平台的扩展领域,就很难完成这项工作。例如,GNU
stat
命令可以分析有关文件时间的信息,但它已经不再(或更少)了可移植性优于GNU
find
。还有一个问题:“您的文件名是否包含空格、制表符、换行符、表单提要等?”特别是换行符,会引起焦虑。因为
ls
是唯一一个查看文件时间的标准工具,如果不进入特定于平台的扩展领域,就很难完成这项工作。例如,GNU
stat
命令可以分析有关文件时间的信息,但不能再多(或少)了可移植性优于GNU
find
。还有一个问题:“您的文件名是否包含空格、制表符、换行符、表单提要等?”换行符尤其会引起焦虑。