根据文件名作为日期删除超过 30 天的文件

Ari*_*Ari 4 linux bash date filenames rm

如果我有一个文件夹,文件名是它们的创建日期:

2019_04_30.txt
2019_04_15.txt
2019_04_10.txt
2019_02_20.txt
2019_01_05.txt
Run Code Online (Sandbox Code Playgroud)

我将如何将文件名与今天的当前日期进行比较

$ date "+%Y_%m_%d"
>>> 2019_04_30
Run Code Online (Sandbox Code Playgroud)

如果文件名日期大于 30 天,则将其删除。我希望结束

2019_04_30.txt
2019_04_15.txt
2019_04_10.txt
Run Code Online (Sandbox Code Playgroud)

我不必遵循这个命名约定,我可以使用更合适的日期格式。

dar*_*urf 5

这是一个bash解决方案。

f30days=$(date +%s --date="-30 days")
for file in 20*.txt; do
    fdate=$(echo $file | tr _ -)
    fsec=$(date +%s --date=${fdate/.txt/})
    if [[ $fsec -lt $f30days ]]; then
        echo "rm $file"
    fi
done
Run Code Online (Sandbox Code Playgroud)

我以“ echo rm $file”结束它而不是真正删除您的文件,这将测试之前的结果。


Sté*_*las 5

zsh

zmodload zsh/datetime
strftime -s start '%Y_%m_%d.txt' $((EPOCHSECONDS - 30*86400))
echo -E rm -i 2*.txt(e:'[[ $REPLY > $start ]]':)
Run Code Online (Sandbox Code Playgroud)

echo -E快乐时删除。

在 GNU 系统和 GNU shell ( bash) 上,您可以执行以下操作:

start=$(date -d '30 days ago' +%Y_%m_%d.txt)
list=()
shopt -s nullglob
for file in 2*.txt; do
  [[ $file > $start ]] && list+=("$file")
done
if (( ${#list[@]} > 0)); then
  echo -E rm -i "${list[@]}"
fi
Run Code Online (Sandbox Code Playgroud)