【问题标题】:bash command inside a function to delete all files except the recent 5函数内的 bash 命令删除除最近 5 个文件之外的所有文件
【发布时间】:2022-10-17 06:01:01
【问题描述】:

我有一个删除备份文件功能,它将参数作为目录名称并备份特定目录的文件和特定类型的文件,如下所示delete_old_backup_files $(dirname $$abc) "$abc.*"

函数体是:

local fpath=$1
local fexpr=$2

   # delete backup files older than a day
   find $fpath -name "${fexpr##*/}" -mmin +1 -type f | xargs rm -f

当前正在删除超过一天的文件。现在我想修改这个函数,使这个函数应该删除所有类型为 $abc.* 的备份文件,除了最后创建的 5 个备份文件。使用 stat 或 -printf 尝试了各种命令,但未能成功。

完成此功能的正确方法是什么?

【问题讨论】:

    标签: bash


    【解决方案1】:

    假设文件名不包含换行符,请 尝试:

    delete_old_backup_files() {
        local fpath=$1
        local fexpr=$2
    
        find "$fpath" -type f -name "${fexpr##*/}" -printf "%T@	%p
    " | sort -nr | tail -n +6 | cut -f2- | xargs rm -f --
    }
    
    • -printf "%T@ %p " 打印自纪元 (%T@) 之后的秒数 由制表符 ( ) 然后是文件名 (%p) 和换行符 ( )。
    • sort -nr 按数字对行进行降序排序(较新的优先, 旧的最后)。
    • tail -n +6 打印第 6 行及以下行。
    • cut -f2- 删除前置时间戳,仅保留文件名。

    [编辑]
    如果是MacOS,请改用(未测试):

    find "$fpath" -type f -print0 | xargs -0 stat -f "%m%t%N" | sort -nr | tail -n +6 | cut -f2- | xargs rm --
    

    stat 命令中,%m 被扩展为修改时间(自纪元以来的秒数),%t 被替换为制表符,%N 被替换为文件名。

    【讨论】:

    • find: -printf: unknown primary or operator 我不知道为什么,但是当我使用 print f 和 stat 时出现上述错误。
    • 你在使用 MacOS 吗?
    • 是的,我正在使用 MacOS
    • 我很抱歉。 MacOS 中的find 命令不支持-printf 选项。我会尝试寻找替代方案。 BR。
    • 我已经测试了该命令,它运行良好,只是对此进行了更新。所以在我的场景中,我需要在特定目录中找到特定文件。所以我将命令更新为` find "$fpath" -name "${fexpr##*/}" -type f -print0 | xargs -0 stat -f "%m%t%N" |排序-nr |尾-n +6 |切-f2- | xargs rm --` 非常感谢@tshiono 的支持。
    【解决方案2】:

    我会使用排序而不是查找。您可以使用ls -t

    $ touch a b c
    $ sleep 3
    $ touch d e f
    ls -t | tr ' ' '
    ' | tail -n +4
    a
    b
    c
    $ ls -t | tr ' ' '
    ' | tail -n +4 | xargs rm
    $ ls
    d  e  f
    

    来自man ls

    -t     sort by modification time, newest first
    

    确保在删除内容之前创建备份:-)

    【讨论】:

    • 注意:您必须对带有空格的文件名进行处理。我建议首先绕过它们。
    • 是的,但 ls -t 列出所有最近的文件。我只需要函数中提到的特定扩展名的文件。 delete_old_backup_files $(dirname $$abc) "$abc.*" local fpath=$1 local fexpr=$2 #删除超过一天的备份文件 find $fpath -name "${fexpr##*/}" -mmin +1 - f 型 | xargs rm -f
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2011-05-06
    • 2016-02-29
    • 2015-01-02
    相关资源
    最近更新 更多