접속 날짜나 생성 날짜가 아닌 파일 이름으로 파일을 삭제하고 싶어요. 파일 이름은 날짜가 되며 일주일에 한 번 cronjob을 실행하여 7일보다 오래된 파일 이름 날짜를 지우고 싶습니다. 내가 하나 만들 수 있어
find /my/directory -type f -name '*file-name.yyyy-mm-dd.qz' -delete
하지만 작동하려면 매주 스크립트를 변경해야 합니다. 나는 매주 내 작업을 수정하는 일을 피하고 싶습니다.
답변1
이는 파일 및 디렉터리 이름의 공백(개행 포함)을 올바르게 처리하는 보다 강력한 형식입니다.
find . -type f -name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz' -exec sh -c 'fdate="${1%.qz}"; fdate="${fdate##*.}"; [ "$fdate" "<" "$(date +%F -d "7 days ago")" ] && rm "$1"' find-sh {} \;
여기에는 일부 사람들에게는 낯설게 보일 수 있는 많은 쉘 트릭이 포함되므로 자세히 살펴보겠습니다.
현재 디렉터리부터 시작하여 모든 일반 파일을 재귀적으로 찾습니다.
find . -type f
...이름이 정확한 패턴 ".YYYY-MM-DD.qz"로 끝나는 이름...
-name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz'
...그런 다음 일치하는 각 파일에 대해 쉘 명령을 실행합니다(작은따옴표 참고)...
-exec sh -c '
...먼저 후행 ".qz"를 제거합니다...
fdate="${1%.qz}";
...그런 다음 "YYYY-MM-DD"만 남기고 선행 부분을 제거합니다...
fdate="${fdate##*.}";
...그리고 해당 문자열을 비교하여 7일 전 날짜에 대해 "YYYY-MM-DD"보다 이전에 정렬되었는지(어휘적으로) 확인합니다.
[ "$fdate" "<" "$(date +%F -d "7 days ago")" ]
...그렇다면 파일을 삭제하세요...
&& rm "$1"'
$0
... 오류 보고를 위해 "스크립트 이름"(예: )으로 "find-sh"를 사용합니다 ...
find-sh
...그리고 발견된 파일 이름을 인라인 쉘 스크립트의 find
매개변수 1( ) 로 설정합니다.$1
{} \;
답변2
코멘트할 수는 없지만 빈 테스트 파일을 생성하는 명령은 다음과 같습니다.
for i in {0..50};do touch blah.`date "+%Y-%m-%d" -d "$i days ago"`.qz ;done
나는 Dave의 대답이 그 효과를 발휘할 것이라고 믿습니다. (for 명령을 완성하려면 "; do"를 사용해야 합니다)
훌륭한 크론 라이너.
답변3
기본적으로 비슷한 날짜 형식을 가진 모든 파일 이름을 가져온 다음 이를 반복하면서 7일 전이 파일 이름에서 찾은 날짜보다 이후인지 확인하고 그렇다면 제거하는 짧은 스크립트를 권장합니다.
날짜 구문 분석은 기본적으로 YYYYMMDD 형식의 정수를 생성하고 이를 비교에 사용합니다. 더 큰 단위는 10의 배수가 더 높으므로 잘 작동합니다.
이것은 제가 머릿속으로 떠올린 대략적인 스크립트입니다. 테스트해 볼 기회가 없었습니다.
for file in $(find /my/directory -type f -name "*file-name.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz")
if [ $(date -d '7 days ago' +"%Y%m%d") -ge $(date -d $(echo $(basename $file) | cut -d '.' -f 2) +"%Y%m%d") ]; then
rm $file
fi
done
답변4
다음을 사용할 수 있습니다.
find /my/directory -type f -name "*file-name.$(date -d '7 days ago' +%Y-%m-%d).qz" -delete
이는 7일 전의 날짜를 쉘에 알려줍니다.$(date -d '7 days ago' +%Y-%m-%d)
예를 들어 오늘이 2016-06-06
다음과 같다면:2016-05-30
따라서 명령이 실행될 때마다 7일 전 날짜가 사용됩니다.
나는 당신이 나를 이해할 수 있기를 바랍니다. 필요한 것이 있으면 댓글을 남겨주세요.