【问题标题】:Linux Bash Script: Delete files in folder, but exclude specific filesLinux Bash 脚本:删除文件夹中的文件,但排除特定文件
【发布时间】:2015-08-18 08:56:59
【问题描述】:

我想创建一个 Shell 脚本,在我执行备份程序之前,该脚本每天都将作为 cronjob 运行。

此 shell 脚本应删除文件夹中的文件。
但不删除:

  • 过去 7 天的文件
  • 过去 4 周在星期日创建的文件
  • 过去 6 个月的第一天创建的文件

如何扩展此代码:

find /path/to/files* -type f -mtime +180 -delete

【问题讨论】:

  • 作为一个快速破解,我会使用否定逻辑:无论你想保留什么 - 移动到其他目录。删除当前目录内容。恢复所需的文件。

标签: linux bash shell backup delete-file


【解决方案1】:

计划

  • 将文件详细信息(名称和日期)读取到数组中
  • 循环数组检查日期的业务状况
  • 如果业务逻辑未设置标志,则删除文件

cleanup_files.sh

#!/bin/bash

# replace with your path to files..
list_files=$(ls ./ -lt --time-style=+"%Y-%m-%d" | 
             awk '{ if( $1 != "total" )printf $7","$6"\n"; }' |
             tr '\n' ' ');

four_weeks_ago=$(date -d "now - 4 weeks" +%s);
seven_days_ago=$(date -d "now - 1 weeks" +%s);
six_months_ago=$(date -d "now - 6 months" +%s);

for fil in $list_files
do
  filename=$(printf "$fil\n" | cut -d, -f1);
  fdate=$(printf "$fil\n" | cut -d, -f2);

  flag=0;
  ts=$(date -d "$fdate" +%s);
  wday=$(date -d "$fdate" +%u);
  mday=$(date -d "$fdate" +%d);

  # check if created in last seven days..
  if [ "$ts" -ge "$seven_days_ago" ]; then
    flag=1;
  fi

  # check if created on a sunday in last four weeks
  if [ "$wday" -eq "7" ] && [ "$ts" -ge "$four_weeks_ago" ]; then
    flag=1;
  fi

  # check if file created on first of month for last 6 months
  if [ "$mday" -eq "01" ] && [ "$ts" -ge "$six_months_ago" ]; then
    flag=1;
  fi

  # if flag is not set delete file
  if [ "$flag" -ne "1" ]; then
    printf "deleting $filename..\n";
    # uncomment only after proper testing..
    # rm "$filename";
  fi
#  printf "$fil\n";
done;

【讨论】:

  • 这正是我所需要的。谢谢您的回答!我在 rm 语句之后添加了这个:mkdir -p old; mv "$filename" old;
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多