
디렉토리에서 5일보다 오래된 파일을 삭제하려면 다음 명령을 사용할 수 있습니다.
find /directory -type f -mtime +5 -delete
하지만 제 경우에는 이름에 "YYYY-MM-DD"가 있고 5일이 지난 파일만 삭제하고 싶습니다.
다음은 몇 가지 파일 이름 예입니다.
TEST_2016-11-20_14_02_52.log
server.log.2016-11-13
locsub.log.2016-12-04
wsgi.txt.2016-12-01
이름 형식이 '인 파일만년 월 일' 및 5일이 지난 콘텐츠는 삭제해야 합니다.
정규식을 사용하여 find 명령에서 파일 이름을 일치시키는 방법은 무엇입니까?
답변1
GNU 사용 find
:
find . -type f -mtime +5 \
-regextype egrep -regex '.*[0-9]{4}-[0-9]{2}-[0-9]{2}[^/]*$' \
-delete
정규식은 형식에 날짜가 포함된 경로 이름의 기본 이름에 있는 모든 문자열과 일치합니다 YYYY-MM-DD
. XXYYYY-MM-DDZZ
where XX
와 ZZ
is 가 다른 문자 와 일치할 수도 있습니다 .
마지막은 [^/]*$
표현식이 현재 경로 이름의 기본 이름과 실제로 일치하는지 확인하고 " /
나머지 문자열과 일치하지 마십시오"를 의미합니다.
대신 쉘 와일드카드 패턴을 사용하십시오(유지 관리가 더 쉬움).
find . -type f -mtime +5 \
-name '*[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]*' \
-delete
이는 -mtime +5
기간이 정수 일수인 파일에 대한 것입니다.엄격하게5일 이상이면 6일 이상입니다. 5일 이상 지난 파일의 경우 -mtime +4
.
답변2
GNU 도구를 사용한다고 가정하면 Babyy가 말하는 거짓 긍정을 방지할 수 있습니다.
find /directory -type f -mtime +5 -print | while read f; do
n=`basename "$f"`
d=`expr "X$n" : 'X.*\([0-9]\{4,\}-[0-9]\{2\}-[0-9]\{2,\}\)'` # (1)
test -n "$d" || continue # (2)
date -d "$d" >/dev/null 2>&1 && rm "$f" # (3)
done
논평:
- (1)파일 이름의 날짜 부분을 에 할당합니다
d
. 여기에는 선행 및 후행 숫자가 포함됩니다. 날짜 부분이 없으면 빈 문자열이 할당됩니다d
. - (2)
"$d"
빈 문자열이면 다음 반복으로 점프합니다. 이는 예방하기 위한 것입니다(삼)date -d
빈 문자열을 인수로 전달하면 성공하므로 파일을 삭제하십시오 . (이것은 GNU의 버그인 것처럼 보이지만date
아마도 이 동작은 의도적인 것 같습니다.) - (삼)
"$d"
유효한 날짜가 포함되어 있으면 파일이 삭제됩니다. 날짜 의date -d
연도 부분이 4자리를 초과하는 경우 월 및 일 부분이 유효하면 작업이 성공합니다. 지금그건진정한 미래 보장형 코드!