다음 파일이 있습니다. 9월 30일, 10월 30일의 파일을 보관하고 나머지는 삭제하고 싶습니다.
-rw-r--r-- 1 nbswmcm advboprd 13463761 Sep 2 01:19 vtm_data_12month_20140902.txt
-rw-r--r-- 1 nbswmcm advboprd 13474125 Sep 3 01:51 vtm_data_12month_20140903.txt
-rw-r--r-- 1 nbswmcm advboprd 13492755 Sep 4 01:57 vtm_data_12month_20140904.txt
-rw-r--r-- 1 nbswmcm advboprd 13499981 Sep 5 01:59 vtm_data_12month_20140905.txt
-rw-r--r-- 1 nbswmcm advboprd 13507296 Sep 7 08:39 vtm_data_12month_20140907.txt
-rw-r--r-- 1 nbswmcm advboprd 13508099 Sep 9 04:02 vtm_data_12month_20140909.txt
-rw-r--r-- 1 nbswmcm advboprd 13508886 Sep 10 01:33 vtm_data_12month_20140910.txt
-rw-r--r-- 1 nbswmcm advboprd 13513056 Sep 11 02:25 vtm_data_12month_20140911.txt
-rw-r--r-- 1 nbswmcm advboprd 13512334 Sep 12 02:36 vtm_data_12month_20140912.txt
-rw-r--r-- 1 nbswmcm advboprd 13512391 Sep 14 08:41 vtm_data_12month_20140914.txt
-rw-r--r-- 1 nbswmcm advboprd 13515984 Sep 16 02:35 vtm_data_12month_20140916.txt
-rw-r--r-- 1 nbswmcm advboprd 13516946 Sep 17 02:27 vtm_data_12month_20140917.txt
-rw-r--r-- 1 nbswmcm advboprd 13523528 Sep 18 02:39 vtm_data_12month_20140918.txt
-rw-r--r-- 1 nbswmcm advboprd 13520200 Sep 19 02:28 vtm_data_12month_20140919.txt
-rw-r--r-- 1 nbswmcm advboprd 13514677 Sep 21 09:33 vtm_data_12month_20140921.txt
-rw-r--r-- 1 nbswmcm advboprd 13518239 Sep 23 02:29 vtm_data_12month_20140923.txt
-rw-r--r-- 1 nbswmcm advboprd 13488002 Sep 24 02:51 vtm_data_12month_20140924.txt
-rw-r--r-- 1 nbswmcm advboprd 13491370 Sep 25 02:38 vtm_data_12month_20140925.txt
-rw-r--r-- 1 nbswmcm advboprd 13414606 Sep 26 02:42 vtm_data_12month_20140926.txt
-rw-r--r-- 1 nbswmcm advboprd 13411621 Sep 28 08:59 vtm_data_12month_20140928.txt
-rw-r--r-- 1 nbswmcm advboprd 13529594 Sep 30 02:52 vtm_data_12month_20140930.txt
-rw-r--r-- 1 nbswmcm advboprd 13520560 Oct 1 02:54 vtm_data_12month_20141001.txt
-rw-r--r-- 1 nbswmcm advboprd 13519613 Oct 2 02:54 vtm_data_12month_20141002.txt
-rw-r--r-- 1 nbswmcm advboprd 13534704 Oct 3 02:19 vtm_data_12month_20141003.txt
-rw-r--r-- 1 nbswmcm advboprd 13545015 Oct 5 08:47 vtm_data_12month_20141005.txt
-rw-r--r-- 1 nbswmcm advboprd 13541506 Oct 7 02:51 vtm_data_12month_20141007.txt
-rw-r--r-- 1 nbswmcm advboprd 13556650 Oct 8 02:31 vtm_data_12month_20141008.txt
-rw-r--r-- 1 nbswmcm advboprd 13551903 Oct 9 02:33 vtm_data_12month_20141009.txt
-rw-r--r-- 1 nbswmcm advboprd 13567484 Oct 10 02:33 vtm_data_12month_20141010.txt
-rw-r--r-- 1 nbswmcm advboprd 13569503 Oct 12 08:40 vtm_data_12month_20141012.txt
-rw-r--r-- 1 nbswmcm advboprd 13567657 Oct 14 02:25 vtm_data_12month_20141014.txt
-rw-r--r-- 1 nbswmcm advboprd 13574132 Oct 15 02:40 vtm_data_12month_20141015.txt
-rw-r--r-- 1 nbswmcm advboprd 13581260 Oct 16 02:50 vtm_data_12month_20141016.txt
-rw-r--r-- 1 nbswmcm advboprd 13585758 Oct 17 02:27 vtm_data_12month_20141017.txt
-rw-r--r-- 1 nbswmcm advboprd 13587851 Oct 19 10:02 vtm_data_12month_20141019.txt
-rw-r--r-- 1 nbswmcm advboprd 13591515 Oct 21 02:43 vtm_data_12month_20141021.txt
-rw-r--r-- 1 nbswmcm advboprd 13602271 Oct 22 02:59 vtm_data_12month_20141022.txt
-rw-r--r-- 1 nbswmcm advboprd 13604358 Oct 23 03:22 vtm_data_12month_20141023.txt
-rw-r--r-- 1 nbswmcm advboprd 13607622 Oct 24 02:52 vtm_data_12month_20141024.txt
-rw-r--r-- 1 nbswmcm advboprd 13605666 Oct 26 10:25 vtm_data_12month_20141026.txt
-rw-r--r-- 1 nbswmcm advboprd 13612303 Oct 28 02:32 vtm_data_12month_20141028.txt
-rw-r--r-- 1 nbswmcm advboprd 13617526 Oct 29 02:49 vtm_data_12month_20141029.txt
-rw-r--r-- 1 nbswmcm advboprd 13627963 Oct 30 02:38 vtm_data_12month_20141030.txt
답변1
GNU 시스템에서는 특정 파일 이름 패턴을 사용하여
ls -r | uniq -w23
그것은 당신을 위해 예약됩니다. 따라서 제거할 수 있습니다:
ls -r | uniq -w23 | xargs mv -t ../to-keep/
그리고 남은 파일을 모두 삭제하세요.
23은 길이입니다 vtm_data_12month_201409
. 따라서 uniq
동일한 23자 길이의 접두사가 있는 파일 목록(역방향 정렬된 파일 목록)의 첫 번째 파일만 반환됩니다.
한 번에 완료됨:
ls -r | awk -F_ 'a[substr($NF,1,6)]++'
삭제할 파일이 나열됩니다.
ls -r | awk -F_ 'a[substr($NF,1,6)]++' | xargs rm -f
(파일 이름에 공백, 따옴표 또는 백슬래시 문자가 포함되어 있지 않다고 가정).
_
여기서는 처음 23자를 보는 대신 마지막 문자 뒤의 처음 6자를 봅니다 .
답변2
logrotate
명령을 사용하십시오 . /var/log
날짜나 크기를 기준으로 로그를 회전할 수 있습니다 .
/etc/cron.daily/logrotate
그리고 를 보세요 /etc/logrotate.conf
. /etc/logrotate.conf
회전하려는 파일을 처리하기 위한 항목을 넣을 수 있어야 합니다 .
다음 웹사이트도 참조하세요:http://www.rackspace.com/knowledge_center/article/understanding-logrotate-utility
도움이 더 필요하면 알려주시기 바랍니다. 노력하겠습니다.
좋아, 내 시스템은 /etc/cron.daily/logrotate
하루에 한 번 logrotate를 호출합니다. 각 파일을 어떻게 처리할지 /etc/logrotate.conf
알려주세요 . logrotate
따라서 수정에 대해서만 걱정하면됩니다./etc/logrotate.conf
해당 항목을 파일에 추가하기만 하면 됩니다 /etc/logrotate.conf
.
/var/log/LOGFILENAME {
monthly
create 0664 root root
rotate 1
}
그런 다음 시스템이나 cron을 다시 시작하면 변경 사항이 적용됩니다. logrotate
프로필을 직접 호출하여 테스트 할 수도 있습니다 .
/usr/sbin/logrotate /etc/logrotate.conf
이 줄은 이전 복사본을 보관하여 지난 달과 이번 달의 두 달 분량의 로그를 생성하도록 rotate 1
지시합니다 . logrotate
이번 달의 로그만 유지하려면 rotate 1
으로 변경하세요.rotate 0
답변3
이 문제를 일반적으로 해결해야 합니까, 아니면 한 번만 해결해야 합니까? 한 번만 해결해야 한다면 때로는 간단한 솔루션이 가장 좋습니다. Bash에서 중괄호 확장을 사용할 수 있습니다.
rm vtm_data_12month_2014{09,10}{01..29}.txt
이는 다음과 같은 이유로 귀하의 사례에 적용될 수 있습니다.
- 전송하려는 매개변수 수가
rm
ARG_MAX를 초과할 가능성은 낮습니다. - 10월과 9월에도 머물고 싶은 날짜가 동일합니다.
이 문제를 더 일반적으로 해결해야 하는 경우에는 달마다 끝나는 날짜가 다르다는 사실을 고려해야 합니다. 예를 들어 10월은 31일에 끝나지만 예제에는 30일까지의 데이터만 포함됩니다.
예제의 파일 명명 체계를 신뢰할 수 있는 경우 다음 명령은 매월 사용 가능한 최신 파일을 제외한 모든 파일을 삭제합니다(파일 생성 또는 수정과 관련된 실제 타임스탬프가 아닌 파일 이름을 기준으로 함).
get_years() {
find ./ -type f | cut -d'_' -f4 | cut -c1-4 | sort | uniq
}
get_months_for_year() {
year=$1
find ./ -iname "vtm_data_12month_${year}*.txt" -type f | cut -d'_' -f4 | cut -c5-6 | sort | uniq
}
get_latest_for_year_month() {
year=$1
month=$2
find ./ -iname "vtm_data_12month_${year}${month}*.txt" -type f | cut -d'_' -f4 | cut -c7-8 | sort | tail -1
}
for year in $(get_years); do
for month in $(get_months_for_year $year); do
latest=$(get_latest_for_year_month $year $month)
end=$(($latest - 1))
for i in $(seq 1 $end); do
day=$(printf '%02d' $i)
rm vtm_data_12month_${year}${month}${day}.txt
done
done
done
DateTime 라이브러리가 있는 bash 이외의 언어는 더 깨끗하고 안정적인 솔루션을 제공할 수 있습니다. 여기에 제공된 두 솔루션 모두 특정 날짜의 파일이 누락되면 오류가 발생합니다.
답변4
bash 스크립트를 사용하여 날짜 유효성을 확인하고 날짜 범위를 생성하는 것은 어렵고 오류가 발생하기 쉽습니다. 가장 좋은 방법은 심층적인 검사를 허용하는 python
기타 perl
고급 스크립트 언어를 사용하는 것입니다 . 날짜 범위 내의 파일을 삭제하고 날짜 범위를 제외하도록 스크립트를 업데이트했습니다.
옵션은 다음과 유사합니다.
범위 내의 파일 삭제
./dfile.py --from 20140929 --to 20141001 --range
범위 밖의 파일 삭제
./dfile.py --from 20140929 --to 20141001 --out-range
프로그램은 또한 인수가 잘못 제공된 경우 유용한 도움말 메시지를 생성합니다.
#!/usr/bin/env python3
import os
import sys
import argparse
import datetime
parser = argparse.ArgumentParser()
parser.add_argument('--from', dest="fromd", type=str, required=True, help="From date")
parser.add_argument('--to', dest="tod", type=str, required=True, help="To date")
parser.add_argument('--range', dest='drange', action='store_true', help="Delete files between the given date")
parser.add_argument('--out-range', dest="orange", action='store_true', help="Delete files apart form the given date")
args = parser.parse_args()
if args.drange and args.orange:
print('Enter either --range or --out-range option')
sys.exit(1)
elif not (args.drange or args.orange):
print('You must select either --range or --out-range option')
sys.exit(1)
from_date = args.fromd
to_date = args.tod
path='/tmp/tmp.54JUy4ZP6x/'
try:
from_date = datetime.datetime.strptime(from_date, '%Y%m%d').date()
to_date = datetime.datetime.strptime(to_date, '%Y%m%d').date()
except ValueError:
print('Check if the date has been given in YYYYMMDD format')
sys.exit(1)
files = [ x for x in os.listdir(path) if x.endswith('.txt') ]
for file in files:
file_date = datetime.datetime.strptime(file[17:25], '%Y%m%d').date()
if args.orange:
# Delete files out of date range
if not from_date < file_date < to_date:
print('Deleting file {}'.format(file))
os.remove(path + '/' + file)
else:
# Delete files within date range
if from_date < file_date < to_date:
print('Deleting file {}'.format(file))
os.remove(path + '/' + file)
path
프로그램에서 변경해야 하는 매개변수를 제외한 모든 매개변수는 구성 가능합니다 .
그것이 당신에게 도움이 되기를 바랍니다.