请帮我如何删除一个在UNIX中超过60天的文件夹中的文件

时间:2014-11-27 04:39:44

标签: shell

我知道如何删除超过60天的文件。但我必须满足以下条件。请帮助我获得正确的脚本以自动执行此操作。

我每月都有以下文件。所以我有这些文件过去3年。

vtm_data_12month_20140301.txt
vtm_data_12month_20140301.control
vtm_mtd_20130622.txt
vtm_mtd_20130622.control
vtm_ytd_20131031.txtvtm_ytd_20131031.control

我想写一个脚本找到超过60天的所有文件并删除它们除了上个月的文件。

假设一月份我想保留最后一个文件(最新)vtm_data_12month_20140131.txt并删除所有30个文件。这里的问题是,我有可能在1月30日收到文件,所以在这种情况下我不应该删除最新文件,但我必须删除其余文件。

请告诉我如何通过shell脚本实现这一目标。非常感谢您的回复。

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。两种主要方法是(1)使用actual file date来确定文件是否被删除或(2)使用date embedded in the filename确定文件日期。两者都有优点和缺陷。您似乎要问的是删除比文件名中嵌入的最新日期早60天或 2 的文件。

正如您所指出的,您可能有许多日期混合的文件相对接近结尾,您可能需要调整日期。您可以提示让end date测量60天后,而不是让脚本解析文件中包含的最大文件日期字符串。否则,只需扫描每个嵌入日期并找到最大值,然后从那里减去60天。以下脚本会提示您输入end_date

实际上,以下脚本包含通过两种方法(和示例数据)删除文件的代码。基于实际文件创建日期((1)以上)删除的代码在使用嵌入日期的代码下方注释掉。查看脚本并了解它的作用。评论相当好。 注意实际rm命令已注释以防止发生意外(即使它要求您输入 YES 以确认删除)。取消注释rm行以便能够实际删除文件。如果您有任何疑问,请发表评论:

#!/bin/bash

oifs="$IFS"     # save current IFS (internal field separator) (default ' \t\n')
IFS=$'\n'       # set IFS to only break on space

## prompt for path containing files & read
printf "\n enter the path to files to remove (no ending '/'): "
read -r rmpath

## validate directory
[ -d "$rmpath" ] || { printf "\nerror: bad path '%s'\n\n" "$rmpath"; exit 1; }

## prompt for ending date of files to keep
printf "\n enter the _end_ date of files to keep 'yyyymmdd' : "
read -r enddatestr

IFS="$oifs"     # reset IFS to original

enddt=$(date -d "$enddatestr" +%s)      # get enddt in seconds since epoch
enddt=$((enddt - (60 * 24 * 3600)))     # subtract 60 days

declare -a rmarray

## Using embedded filename date
mdate=$(date -d "@$enddt" +%Y%m%d)      # get mdate string to compare to filename

## fill rmarray with file dates older than mdate
for i in $(find "$rmpath" -maxdepth 1 -type f); do

    ffname="${i##*/}"       # full filename component
    fname=${ffname%.*}      # filename w/o extension
    fdate="${fname##*_}"    # get file date string
    ## if fdate before mdate, add to remove array
    [ "$mdate" -gt "$fdate" ] && rmarray+=( "$i" )

done

# ### Using actual file creation date
# tgtfile=/tmp/tgt_$(date +%s)            # tmp filename to measure against
# 
# ## create temp file to measure against with find & set trap to remove
# touch -t $(date -d "@${enddt}" +%Y%m%d%H%M.%S) "$tgtfile" &&
# trap 'rm -rf "$tgtfile"' 0
# 
# ## fill array with filenames to remove
# rmarray=( $(find "$rmpath" -maxdepth 1 -type f ! -newer $tgtfile) )

## verify files are contained in rmarray
[ "${#rmarray[@]}" -lt 1 ] && {    
    printf "\n No files matched the dates for removal.\n\n"
    exit 1
}

## print files that will be removed
printf "\n ** the following files will be removed **\n\n"

for i in "${rmarray[@]}"; do

    ls -al "$i"

done

## prompt for actual removal
printf "\n Continue with ACTUAL removal (YES to remove) : "
read ans

if [ "$ans" = "YES" ]; then
    for i in "${rmarray[@]}"; do

        # rm "$i"   # NOTE: 'rm' is commented, uncomment to really delete

    done
else
    printf "\n You entered '%s' (not YES), no removal performed.\n\n" "$ans"
fi

exit 0

测试目录:

$ls -l dat/fstst
total 0
-rw-r--r-- 1 david david 0 Nov 27 01:10 vtm_data_12month_20140301.control
-rw-r--r-- 1 david david 0 Nov 27 01:10 vtm_data_12month_20140301.txt
-rw-r--r-- 1 david david 0 Nov 27 01:10 vtm_mtd_20130622.control
-rw-r--r-- 1 david david 0 Nov 27 01:10 vtm_mtd_20130622.txt
-rw-r--r-- 1 david david 0 Nov 27 01:10 vtm_ytd_20131031.control
-rw-r--r-- 1 david david 0 Nov 27 01:10 vtm_ytd_20131031.txt

使用:

$ bash rmfiles_60days.sh

 enter the path to files to remove (no ending '/'): dat/fstst

 enter the _end_ date of files to keep 'yyyymmdd' : 20140301

 ** the following files will be removed **

-rw-r--r-- 1 david david 0 Nov 27 01:10 dat/fstst/vtm_mtd_20130622.txt
-rw-r--r-- 1 david david 0 Nov 27 01:10 dat/fstst/vtm_ytd_20131031.control
-rw-r--r-- 1 david david 0 Nov 27 01:10 dat/fstst/vtm_ytd_20131031.txt
-rw-r--r-- 1 david david 0 Nov 27 01:10 dat/fstst/vtm_mtd_20130622.control

 Continue with ACTUAL removal (YES to remove) : YES

<强>结果:

$ ls -l dat/fstst
total 0
-rw-r--r-- 1 david david 0 Nov 27 01:10 vtm_data_12month_20140301.control
-rw-r--r-- 1 david david 0 Nov 27 01:10 vtm_data_12month_20140301.txt

以下是使用实际文件日期的示例:

测试目录:

$ls -l dat/tst
total 324
-rw-r--r-- 1 david david    74 Sep  9 01:23 1.txt
-rw-r--r-- 1 david david    74 Sep  9 01:23 2.txt
-rw-r--r-- 1 david david   201 Aug  1 03:47 3line.dat
-rw-r--r-- 1 david david   205 Aug  1 03:35 3line.dat.sav
-rw-r--r-- 1 david david    88 Aug 13 04:05 catfile.txt
-rw-r--r-- 1 david david    39 Jul  4 14:40 comma
-rw-r--r-- 1 david david   291 Sep 23 03:00 createfile.txt
-rw-r--r-- 1 david david    11 Jul 17 03:54 data.dat
-rw-r--r-- 1 david david     8 Jul 17 03:54 datb.dat
-rw-r--r-- 1 david david   369 Oct  2 14:25 dia.txt
-rw-r--r-- 1 david david    36 Nov  6 15:51 dicta.dat
-rw-r--r-- 1 david david 23895 Sep  9 17:14 dna.dat
-rw-r--r-- 1 david david   243 Nov  4 23:07 domain.dat
-rw-r--r-- 1 david david   276 Nov 23 00:32 ecread.dat
(snip)

使用:

$ bash rmfiles_60days.sh

 enter the path to files to remove (no ending '/'): dat/tst

 enter the _end_ date of files to keep 'yyyymmdd' : 20141031

 ** the following files will be removed **

-rw-r--r-- 1 david david 205 Aug  1 03:35 dat/tst/3line.dat.sav
-rw-r--r-- 1 david david 29 Jun 29 02:23 dat/tst/f1f2.dat
-rw-r--r-- 1 david david 8 Jul 17 03:54 dat/tst/datb.dat
-rw-r--r-- 1 david david 60 Jul 27 23:24 dat/tst/vowels.txt
-rw-r--r-- 1 david david 134 Aug 11 00:32 dat/tst/outfile.txt
-rw-r--r-- 1 david david 4622 Jun 26 02:49 dat/tst/single.xml
-rw-r--r-- 1 david david 99 Jul  4 14:51 dat/tst/hostnm
-rw-r--r-- 1 david david 115 Aug  7 01:35 dat/tst/ltags.txt
-rw-r--r-- 1 david david 122 Aug 29 11:11 dat/tst/hh.dat
-rw-r--r-- 1 david david 509 Jul 21 17:28 dat/tst/orders.txt
-rw-r--r-- 1 david david 205 Jun 27 01:06 dat/tst/table.html
(snip)

 Continue with ACTUAL removal (YES to remove) : YES

<强>结果:

$ ls -l dat/tst
total 168
-rw-r--r-- 1 david david    74 Sep  9 01:23 1.txt
-rw-r--r-- 1 david david    74 Sep  9 01:23 2.txt
-rw-r--r-- 1 david david   291 Sep 23 03:00 createfile.txt
-rw-r--r-- 1 david david   369 Oct  2 14:25 dia.txt
-rw-r--r-- 1 david david    36 Nov  6 15:51 dicta.dat
-rw-r--r-- 1 david david 23895 Sep  9 17:14 dna.dat
-rw-r--r-- 1 david david   243 Nov  4 23:07 domain.dat
-rw-r--r-- 1 david david   276 Nov 23 00:32 ecread.dat
-rw-r--r-- 1 david david    93 Nov  2 21:43 empdata.dat
(snip)