【问题标题】:How to delete files older than 30 days based on the date in the filename [duplicate]如何根据文件名中的日期删除超过 30 天的文件 [重复]
【发布时间】:2023-03-18 16:53:02
【问题描述】:

我每天都会更新 CSV 文件,我们会根据文件名中的日期处理文件并删除超过 30 天的文件。 示例文件名:

XXXXXXXXXXX_xx00xx_**20171001**.000000_0.csv

我想在 crontab 中安排作业每天删除 30 天前的文件。

路径可以是/mount/store/ XXXXXXXXXXX_xx00xx_**20171001**.000000_0.csv

if [ $(date -d '-30 days' +%Y%m%d) -gt $D ]; then
    rm -rf $D
fi

上面的脚本似乎对我没有帮助。请帮助我。 这两天我一直在尝试。

使用 CENTOS7

谢谢。

【问题讨论】:

  • 路径可以是还是其他格式?
  • 路径是/mount/store。
  • 我没有CentOS,有gnu-find吗?是否有 cdate 和 mdate 并且其中之一与名称中的日期同步?

标签: bash shell unix


【解决方案1】:

对于所有文件:

  • 提取日期
  • 触摸带有该日期的文件
  • 使用 -mtime 选项删除文件

在所有文件的所需目录中执行此操作:

f=XXXXXXXXXXX_xx00xx_20171001.000000_0.csv
d=$(echo $f | sed -r 's/[^_]+_[^_]+_(20[0-9]{6})\.[0-9]{6}_.\.csv/\1/')
touch -d $d $f

对整个目录执行该操作后,删除旧的:

find YourDir -type f -mtime +30 -name "*.csv" -delete 

Gnu-sed 有 -delete 选项。其他发现可能需要 -exec rm ... 。

之前的测试。其他陷阱是受触摸影响的不同类型的日期(mtime、ctime、atime)。

测试,用触摸操作日期:

touch XXXXXXXXXXX_xx00xx_20171001.000000_0.csv
f=XXXXXXXXXXX_xx00xx_20171001.000000_0.csv; d=$(echo $f | sed -r 's/[^_]+_[^_]+_(20[0-9]{6})\.[0-9]{6}_.\.csv/\1/'); touch -d $d $f 
ls -l $f
-rw-rw-r-- 1 stefan stefan 0 Okt  1 00:00 XXXXXXXXXXX_xx00xx_20171001.000000_0.csv

【讨论】:

  • 在这个文件名中XXXXXXXXXXXX_xx00xx_20171001.000000_0.csv可以是任意随机字符。XXXX=随机字符,0000=随机数
  • 我们只能使用您提供给我们的信息。 “任何随机字符”将包括其他字符串部分、匹配日期。如果你不提供信息,如何在讨论中找到日期,我们不得不猜测。除此之外,这不是get a coder for free 服务,因此请尝试一下并根据您的需要修复表达式。这应该是一种帮助,而不是现成的解决方案。
  • 感谢用户的帮助。但是,请尝试理解,我是这个非常基本的初学者。我有自己的专业知识,可以根据我的专业知识为不同的社区做出贡献。让生活让生活是我的政策。冷静点 。感谢所有的帮助。干杯:)
  • touch 更改日期会破坏文件的信息。我不建议这种方法。
  • @kvantour:我想说潜在用户应该了解自己,是否需要保留信息。
【解决方案2】:

从文件名中提取日期的一种有效方法是使用变量扩展

f=XXXXXXXXXXX_xx00xx_20171001.000000_0.csv
d=${f%%.*}    # removes largest suffix .*
d=${d##*_}    # removes largest prefix *_

或者使用 bash 特定的正则表达式

if [[ $f =~ [0-9]{8} ]]; then echo "$BASH_REMATCH"; fi

【讨论】:

    【解决方案3】:

    如果您有来自dateutilsdgrep,这是一个解决方案。

    ls *.csv | dateutils.dgrep -i '%Y%m%d' --le $(date -d "-30 day" +%F) | xargs -d '\n' rm
    

    首先,我们可以使用lsfind 来获取文件名列表。然后,我们可以将结果通过管道传输到dgrep,以过滤包含与我们的条件匹配的日期字符串的文件名(在这种情况下超过 30 天)。最后,我们将结果通过管道传递给xargs rm,以删除所有匹配的文件。

    • -i '%Y%m%d' 输入文件名中指定的日期格式
    • --le $(date -d "-30 day" +%F) 过滤超过 30 天的日期

    您可以将rm 更改为printf "%s\n" 以在实际删除命令之前对其进行测试。

    【讨论】:

    【解决方案4】:

    以下方法不查看文件的任何生成时间信息,它假定文件名中的日期与文件的创建日期无关。

    #/usr/bin/env bash
    d=$(date -d "-30 days" "+%Y%m%d")
    for file in /yourdir/*csv; do
         date=${file:$((${#file}-21)):8}
         (( date < d )) && rm $file
    done
    

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2020-05-10
      • 1970-01-01
      • 2018-02-22
      相关资源
      最近更新 更多