수정 날짜 및 파일 이름으로 스크립트 삭제

수정 날짜 및 파일 이름으로 스크립트 삭제

현재 7일이 지난 파일을 삭제하는 스크립트를 작성 중입니다. 이것이 나의 현재 스크립트입니다.

find -type f -mtime +6 -exec rm -rf {} \;

LOGS파일 이름에 포함된 내용 만 제거하도록 이름 패턴을 포함해야 합니다 . 예시 파일:

  • ApplicationA.txt
  • 애플리케이션B.txt
  • AppA_LOGS.txt
  • AppB_LOGS.txt

AppA_LOGS.txt파일 만 삭제하고 AppB_LOGS.txt(7일이 지났다고 가정) 7일이 넘은 App.txt경우에도 AppB.txt보관합니다 .

이것을 현재 스크립트에 어떻게 추가할 수 있나요? 감사해요.

답변1

이름으로 필터링하려면 -name쉘 와일드카드에 사용된 것과 유사한 와일드카드 패턴을 따르는 조건자를 사용하십시오.

find . -name '*_LOGS.txt' -type f -mtime +6 -exec rm -f {} +

일반적으로 파일 메타데이터 기반 필터보다 저렴하므로 이 필터를 먼저 배치하는 것이 좋습니다(일부 find구현에서는 자동으로 순서가 변경되지만). 이렇게 하면 이름이 file 로 끝나지 _LOGS.txt않아 파일이 제외된 경우 find해당 메타데이터를 검색할 필요가 없습니다.

쉘 와일드카드와 마찬가지로 *모든 문자 시퀀스와 일치합니다. 쉘 글로브와 달리 이름이 (hidden files) 로 시작하는 파일에 대해 특별한 처리가 없으므로 .해당 파일도 포함됩니다. 이름이 로 시작하는 디렉터리의 파일에 대해서도 마찬가지입니다 ..

또한 rm여러 파일 이름을 인수로 사용할 수 있으므로 +대신 구분 기호 ;로 사용할 수 있습니다 -exec. 또한 find종료 코드를 통해 오류를 보고할 수 있다는 장점도 있습니다 .rm

find또한 이식성을 위해서는 검색할 위치를 알 수 있도록 최소한 하나의 파일이나 디렉터리를 인수로 제공해야 합니다 . 일부 구현에서는 어디를 볼지 지정하지 않으면 기본적으로 (현재 작업 디렉터리)로 설정되지만 find다른 구현에서는 그렇지 않습니다..

을 사용하는 경우 zsh다음을 수행할 수도 있습니다.

rm -f -- **/*_LOGS.txt(D.m+6)

이는 , of 와 .동일하며 숨겨진 파일과 숨겨진 디렉터리의 파일도 고려합니다 .-type fm+6-mtime +6Dfind

일부 구현과 달리 find로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스가 ​​이름에 포함된 파일을 삭제하는 것은 여전히 ​​관리됩니다. 그러나 rm매우 큰 파일 목록을 삭제해야 하는 경우 수행되지 않을 수 있습니다(그러나 이 문제를 해결하려면 내장된 zargs기능이나 zsh/files모듈을 참조하십시오 rm).

관련 정보