【问题标题】:Sort results from find and grab subset (bash)从查找和抓取子集(bash)中对结果进行排序
【发布时间】:2010-02-19 23:46:37
【问题描述】:

我有一对 bash 脚本,其中一个用于转储 mysql dbs,第二个用于清除旧备份

我一直依赖日期,因此任何超过 7 天的文件都会被清除,并且每天都会创建新的备份。结果是 7 天前的一组备份。

现在我有 20 多个 dbs 我已将日常工作分为每日和每周工作。如果我继续使用查找和日期方法,我将失去过去一周。

问题

如何按日期对 find 的输出进行排序,然后清除除最近的 7 之外的所有内容。(因此,即使最近的 2 个月大,它仍然存在)

这是据我所知,但并不像预期的那样。也许使用 ls 可能是更好的选择 9find 是使用日期作为清除的唯一标准的残余)

OLDFILES=`find -regex .*sql.*`

set -- $OLDFILES

if [ -z $1 ]
then
    printf "\tNo files matching purge criteria\n" | tee -a $LOGFILE
else
    printf "\tSQL Files being Delete from $HERE\n" | tee -a $LOGFILE
    printf "\t\t%s\n" $OLDFILES  | tee -a $LOGFILE
fi
# $RETAIN is the # of recent to keep
# so I want to grab a subset from 0 to (total - retain), and purge them
TOBURN=$(( $# - $RETAIN ))
printf " grab first %s files. %s  - %s" $TOBURN $# $RETAIN
if [ $TOBURN -gt 0 ]
then
    TOPURGE=("$@:0:$TOBURN")
    printf "\n\nREMOVING..\n\t\t%s\n" $TOPURGE
fi

现有文件

            ./webbmaster_bellarose_joomla_01-09-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-25-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-10-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-04-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-25-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-29-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-30-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-28-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-06-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-13-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-24-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-21-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-24-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-27-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-26-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-17-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-03-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-21-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-20-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-16-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-31-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-11-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-05-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-14-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-22-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-12-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-17-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-18-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-20-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-08-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-22-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-27-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-23-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-07-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-26-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-19-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-29-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-15-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-28-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-01-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-18-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-02-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-23-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-19-2009.sql.gz

清除目标(我想为简单的 rm -f $var 设置变量)

            ./webbmaster_bellarose_joomla_01-09-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-25-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-10-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-04-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-30-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-28-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-06-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-13-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-21-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-24-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-27-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-17-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-03-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-21-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-20-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-16-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-31-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-11-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-05-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-14-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-22-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-12-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-17-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-18-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-20-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-08-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-22-2009.sql.gz
            ./webbmaster_bellarose_joomla_12-23-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-07-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-26-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-19-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-29-2009.sql.gz
            ./webbmaster_bellarose_joomla_01-15-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-01-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-18-2010.sql.gz
            ./webbmaster_bellarose_joomla_01-02-2010.sql.gz
            ./webbmaster_bellarose_joomla_12-19-2009.sql.gz

(日期 1/23 - 1/29 保持不变)

【问题讨论】:

    标签: bash find purge


    【解决方案1】:

    请帮自己(和其他所有人)一个大忙,开始以 ISO-8601 格式(即 YYYY-MM-DD)编写日期

    例如而不是

    ./webbmaster_bellarose_joomla_12-29-2009.sql.gz
    

    你会的

    ./webbmaster_bellarose_joomla_2009-12-29.sql.gz
    

    这样做有many benefits,最重要的是这里的时间顺序和字母顺序变得相同。无需查找,只需列出文件,倒序,删除前 7 行并删除所有剩余文件:

    ls *sql* | tac | sed 1,7d | tr '\012' '\000' | xargs -0 --no-run-if-empty rm
    

    更新:“前进”是什么意思?据我所知,我的解决方案可以 100% 解决您的问题:

    /tmp/so>cat existing_files
    ./webbmaster_bellarose_joomla-2009-12-17.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-18.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-19.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-20.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-21.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-22.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-23.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-24.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-25.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-26.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-27.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-28.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-29.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-30.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-31.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-01.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-02.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-03.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-04.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-05.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-06.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-07.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-08.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-09.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-10.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-11.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-12.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-13.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-14.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-15.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-16.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-17.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-18.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-19.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-20.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-21.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-22.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-23.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-24.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-25.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-26.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-27.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-28.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-29.sql.gz
    /tmp/so>cat targets_for_purging
    ./webbmaster_bellarose_joomla-2009-12-17.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-18.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-19.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-20.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-21.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-22.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-23.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-24.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-25.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-26.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-27.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-28.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-29.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-30.sql.gz
    ./webbmaster_bellarose_joomla-2009-12-31.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-01.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-02.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-03.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-04.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-05.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-06.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-07.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-08.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-09.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-10.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-11.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-12.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-13.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-14.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-15.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-16.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-17.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-18.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-19.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-20.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-21.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-22.sql.gz
    /tmp/so>sed 's/\(.\{29\}\)_\(..-..\)-\(....\)/\1-\3-\2/' existing_files | sort > existing_files.8601
    /tmp/so>sed 's/\(.\{29\}\)_\(..-..\)-\(....\)/\1-\3-\2/' targets_for_purging | sort > targets_for_purging.8601
    /tmp/so>mkdir files
    /tmp/so>cd files
    /tmp/so/files>xargs touch < ../existing_files.8601
    /tmp/so/files>ls -1
    webbmaster_bellarose_joomla-2009-12-17.sql.gz
    webbmaster_bellarose_joomla-2009-12-18.sql.gz
    webbmaster_bellarose_joomla-2009-12-19.sql.gz
    webbmaster_bellarose_joomla-2009-12-20.sql.gz
    webbmaster_bellarose_joomla-2009-12-21.sql.gz
    webbmaster_bellarose_joomla-2009-12-22.sql.gz
    webbmaster_bellarose_joomla-2009-12-23.sql.gz
    webbmaster_bellarose_joomla-2009-12-24.sql.gz
    webbmaster_bellarose_joomla-2009-12-25.sql.gz
    webbmaster_bellarose_joomla-2009-12-26.sql.gz
    webbmaster_bellarose_joomla-2009-12-27.sql.gz
    webbmaster_bellarose_joomla-2009-12-28.sql.gz
    webbmaster_bellarose_joomla-2009-12-29.sql.gz
    webbmaster_bellarose_joomla-2009-12-30.sql.gz
    webbmaster_bellarose_joomla-2009-12-31.sql.gz
    webbmaster_bellarose_joomla-2010-01-01.sql.gz
    webbmaster_bellarose_joomla-2010-01-02.sql.gz
    webbmaster_bellarose_joomla-2010-01-03.sql.gz
    webbmaster_bellarose_joomla-2010-01-04.sql.gz
    webbmaster_bellarose_joomla-2010-01-05.sql.gz
    webbmaster_bellarose_joomla-2010-01-06.sql.gz
    webbmaster_bellarose_joomla-2010-01-07.sql.gz
    webbmaster_bellarose_joomla-2010-01-08.sql.gz
    webbmaster_bellarose_joomla-2010-01-09.sql.gz
    webbmaster_bellarose_joomla-2010-01-10.sql.gz
    webbmaster_bellarose_joomla-2010-01-11.sql.gz
    webbmaster_bellarose_joomla-2010-01-12.sql.gz
    webbmaster_bellarose_joomla-2010-01-13.sql.gz
    webbmaster_bellarose_joomla-2010-01-14.sql.gz
    webbmaster_bellarose_joomla-2010-01-15.sql.gz
    webbmaster_bellarose_joomla-2010-01-16.sql.gz
    webbmaster_bellarose_joomla-2010-01-17.sql.gz
    webbmaster_bellarose_joomla-2010-01-18.sql.gz
    webbmaster_bellarose_joomla-2010-01-19.sql.gz
    webbmaster_bellarose_joomla-2010-01-20.sql.gz
    webbmaster_bellarose_joomla-2010-01-21.sql.gz
    webbmaster_bellarose_joomla-2010-01-22.sql.gz
    webbmaster_bellarose_joomla-2010-01-23.sql.gz
    webbmaster_bellarose_joomla-2010-01-24.sql.gz
    webbmaster_bellarose_joomla-2010-01-25.sql.gz
    webbmaster_bellarose_joomla-2010-01-26.sql.gz
    webbmaster_bellarose_joomla-2010-01-27.sql.gz
    webbmaster_bellarose_joomla-2010-01-28.sql.gz
    webbmaster_bellarose_joomla-2010-01-29.sql.gz
    /tmp/so/files>ls *sql* | tac | sed 1,7d | tr '\012' '\000' | xargs -0 --no-run-if-empty rm
    /tmp/so/files>ls -1 ./*
    ./webbmaster_bellarose_joomla-2010-01-23.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-24.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-25.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-26.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-27.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-28.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-29.sql.gz
    /tmp/so/files>comm -3 ../existing_files.8601 ../targets_for_purging.8601
    ./webbmaster_bellarose_joomla-2010-01-23.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-24.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-25.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-26.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-27.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-28.sql.gz
    ./webbmaster_bellarose_joomla-2010-01-29.sql.gz
    /tmp/so/files>
    

    【讨论】:

      【解决方案2】:

      如果文件都在一个目录中(即您不需要使用 find 来递归子目录),您可以使用 ls(1) 的 -t 参数按时间排序文件列表,然后删除第一个7 个带尾 (1) 的条目。

      rm -f $(ls -t *sql* | tail -n +8)
      

      [编辑:我添加了 -f 以防替换导致空列表]

      或者在循环中...

      ls -t *sql* | tail -n +8 | while read file
          echo "Purging: $file"
          rm "$file"
      done
      

      tail 的参数是 +8,因为您希望它从第 8 行开始拖尾(即删除前 7 行)。

      删除文件后,你可以烧掉剩下的。

      【讨论】:

      • 是的,我想保留最近的 7 个,而不是删除。对于任何给定的 n 目录,这可能意味着删除 0 或 63 个文件。
      • 这是保留最新的 7。它会删除最近 7 之后的任何内容。关于删除前 7 个条目的评论是将它们从要清除的文件列表中删除(即保留它们) .
      【解决方案3】:
      OLDIFS="$IFS"
      IFS=$'\n'
      topurge=($(find -mindepth 1 -printf "%T@ %P\n" | sort -n -r | cut -d' ' -f 2- | tail -n +7))
      IFS="$OLDIFS"
      

      【讨论】:

      • 这在我的测试中最多打印 1 个文件,它似乎不是最旧或最新的,只是一堆随机文件。
      • 那是因为它创建了一个数组。请改用for f in "${topurge[@]}" ; do echo "$f" ; done
      【解决方案4】:

      这是一个想法:

      oldest_to_keep=`find . -name \*.sql | xargs \ls -1rc | tail -7 | head -1`
      find . -name \*.sql -not -samefile $oldest_to_keep -not -newer $oldest_to_keep
      

      如果您确信这是正常的,那么第二个 find 应该有 -exec rm \{\} ;。 :)

      【讨论】:

      • 这是我测试中最新的 7 个。 .. 但也许是一个好的开始/.
      猜你喜欢
      • 1970-01-01
      • 2015-01-27
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多