【问题标题】:Bash script, match on dates like?Bash 脚本,匹配日期?
【发布时间】:2010-09-19 21:26:45
【问题描述】:

我正在编写一个脚本来删除一些超过 1 周的构建工件。

文件的名称格式为 artifact-1.1-200810391018.exe

如何仅删除超过 1 周的文件,不包括日期时间戳末尾的小时和分钟时间?

目前它正在删除目录中的所有文件。

#!/bin/sh

NIGHTLY_LOCATIONS=( "/foo" "/bar" )

ARTIFACT_PREFIX="artifact-*-"

NUM_TO_KEEP=7

for home in $(seq 0 $((${#NIGHTLY_LOCATIONS[@]} - 1))); do
        echo "Removing artifacts for" ${NIGHTLY_LOCATIONS[$location]}

        for file in `find ${NIGHTLY_LOCATIONS[$location]} -name "$ARTIFACT_PREFIX*"`; do

                keep=true

                for day in $(seq 0 $((${NUM_TO_KEEP} - 1))); do
                        date=`date --date="$day days ago" +%Y%m%d`

                        echo $(basename $file ".exe") " = " $ARTIFACT_PREFIX$date

                        if [ "$(basename $file ".exe")" != "$ARTIFACT_PREFIX$date" ]; then
                                keep=false
                        fi
                done

                if [ !$keep ]; then
                        echo "Removing file"
                        rm -f $file
                fi
        done done

【问题讨论】:

  • 我喜欢 VonC 的回答,但以防万一,您是否有理由不能依赖文件系统日期而必须使用文件名中嵌入的时间?

标签: bash unix shell scripting


【解决方案1】:

你的意思是,类似于:

find /path/to/files -name "artifact*" -type f -mtime +7 -exec rm {} \;

?

【讨论】:

    【解决方案2】:

    如果您信任文件的 mtime,您可以使用 find 进行简单的扫描:

    find "${NIGHTLY_LOCATIONS}" -name $ARTIFACT_PREFIX -type f -mtime +7 -delete
    

    【讨论】:

    • 不错。 VonC 打败了你,但我喜欢 -delete 而不是“-exec rm {} \;”,我会使用它,因为我不知道 -delete。谢谢!
    • -exec rm 可能更便携。
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 2022-10-23
    • 2014-09-30
    • 2014-11-21
    • 2011-10-17
    • 2017-05-02
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多