Удаление файлов старше месяца

Необходимо удалить все подкаталоги, которые составляют месяц. Но в последний день месяца данные следует игнорировать в течение предыдущих трех месяцев.

Представление data representation выглядит следующим образом:

 bkp_01102014 bkp_04102014 bkp_07102014 bkp_11102014 bkp_15112014 ................... ................... bkp_24112014 bkp_27112014 bkp_30062014 bkp_31072 bkp_20092014 

Как автоматизировать это с помощью find или любой другой команды?

Я думаю, вам не нужно переименовывать файлы. Вы можете преобразовать имена файлов на лету (первое sed), сравнить их с датой (awk) и преобразовать соответствующие имена файлов назад (второе sed).

 find parent/directory -maxdepth 1 -type d -name 'bkp_*' | \ sed 's#parent/directory/bkp_\(..\)\(..\)\(....\)#\3\2\1#' | \ awk -v date=$(date --date='3 months ago' +%Y%m%d) '$0<$date{print $0}' | \ sed 's#\(....\)\(..\)\(..\)#parent/directory/bkp_\3\2\1#' | \ xargs rm -r 

Вы должны проверить это без первой части xargs rm!

Пытался написать сценарий Bash. Пожалуйста, проверьте, не поможет ли это вам.

 #!/bin/bash NOW=`date +%s` last_day() { case $MM in 01|03|05|07|08|10|12 ) echo "31" ;; 04|06|09|11 ) echo "30" ;; 02 ) echo "28" ;; esac } for file in `ls -1 bkp*` do # echo $file DATE=`echo $file | tr -cd [0-9]` # Extract Day of the Month from file name YY=`echo $DATE | cut -c5-8` # Extract Year from file name MM=`echo $DATE | cut -c3-4` # Extract Month of Year fro file name DD=`echo $DATE | cut -c1-2` FDATE=`echo ${YY}${MM}${DD}` # Re-arrange the date FDATE=`date +%s -d $FDATE` # Date in terms of seconds # echo "FILEDATE= $FDATE" DIFF=`echo "$NOW - $FDATE" | bc` # Difference between NOW and FILEDATE in Seconds # echo "DIFF FROM NOW= $DIFF" DIFFDAYS=`echo "$DIFF / 86400" | bc` # Difference in terms of DAYS DIFFMONTHS=`echo "$DIFFDAYS / 30" | bc` # Difference in terms of MONTHS # echo "DIFF IN DAYS= $DIFFDAYS" # echo "DIFF IN MONTHS = $DIFFMONTHS" LASTDAY=$(last_day $MM) # To determine whether it is a last day of month # echo $LASTDAY if [ $DIFFMONTHS -ge 1 ] then if [ $DD -eq $LASTDAY -a $DIFFMONTHS -ge 4 ] then rm -rf $file else rm -rf $file fi fi done 

Выход теста:

Перед выполнением скрипта:

 $ ls bkp_20082013 bkp_20082014 bkp_20112014 bkp_20071989 bkp_20092014 bkp_30112014 bkp_20072014 bkp_20102014 bkp_31102014 

После выполнения скрипта:

 bkp_20112014 bkp_30112014