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