특정 날짜보다 오래되고 파일 이름에 특정 문자열이 포함된 파일을 찾아 삭제합니다.

특정 날짜보다 오래되고 파일 이름에 특정 문자열이 포함된 파일을 찾아 삭제합니다.

디렉토리에서 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-DDZZwhere XXZZis 가 다른 문자 와 일치할 수도 있습니다 .

마지막은 [^/]*$표현식이 현재 경로 이름의 기본 이름과 실제로 일치하는지 확인하고 " /나머지 문자열과 일치하지 마십시오"를 의미합니다.

대신 쉘 와일드카드 패턴을 사용하십시오(유지 관리가 더 쉬움).

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자리를 초과하는 경우 월 및 일 부분이 유효하면 작업이 성공합니다. 지금그건진정한 미래 보장형 코드!

관련 정보