한 달 전의 모든 하위 디렉터리를 삭제해야 합니다. 그러나 해당 월의 마지막 3개월에 대한 데이터는 무시되어야 합니다.
상황 data representation
은 다음과 같습니다.
bkp_01102014 bkp_04102014 bkp_07102014 bkp_11102014 bkp_15112014
...................
...................
bkp_24112014 bkp_27112014 bkp_30062014 bkp_31072 bkp_20092014
또는 다른 명령을 사용하여 find
이를 자동화하려면 어떻게 해야 합니까?
답변1
이 파일의 이름을 바꿀 필요는 없다고 생각합니다. 파일 이름을 즉시 변환하고(첫 번째 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 부분 없이 테스트해야 합니다!
답변2
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