나는 다음 스크립트를 작성했습니다.
#!/bin/bash
DAYSOLD="2"
users_dir="/users"
cd $users_dir
date >> cleanup.log; du -h --max-depth=1 | sort -hr >> cleanup.log
find $users_dir -mtime +$DAYSOLD -type f -exec rm -v {} \;
"작업 공간" 디렉터리에서 2일이 지난 파일만 삭제하고 싶습니다. 이 작업을 어떻게 수행해야 합니까?
/users/user1/workspace
/users/user2/workspace
/users/user3/workspace
도움을 주셔서 감사합니다. 이 작업을 수행하는 방법을 배우고 싶습니다.
답변1
-mtime "+$days"
(마지막 수정 시간 기준) 반올림된 파일 선택아래에일수는 정수입니다.엄격하게보다 나은 $days
...
2일 23시간이 지난 파일 -mtime +2
은 2일이 지났고 2
.
따라서 다음이 필요합니다.
find "$users_dir"/*/workspace -mtime "+$(( DAYSOLD - 1 ))" -type f -delete
$DAYSOLD
을 제거하려면 다음 workspace
을 $users_dir
수행할 수도 있습니다.
find "$users_dir"/*/workspace '(' -mtime "$DAYSOLD" -o -mtime "+$DAYSOLD" ')' \
-type f -delete
$DAYSOLD
수명(정수 일수)이 . 보다 크거나 같은 파일을 삭제합니다 $DAYSOLD
.
-delete
비표준 확장이지만 find
Ubuntu의 GNU에서 사용할 수 있으며 를 사용하는 것보다 낫습니다 -exec rm
. -delete -print
성공적으로 삭제된 파일 목록을 만들 수 있습니다.
기억해변수 참조cd
그리고 1을 수행하기 전에 종료 상태를 확인하십시오. (cd -P -- "$users_dir" && exec du...)
그렇지 않으면 du
실패할 경우 잘못된 디렉토리에서 실행됩니다 cd
. 또한 서브셸 사용에 유의하세요. 그렇지 않으면 $users_dir
상대 경로인 경우 제대로 작동하지 않습니다. 실제로는 다음과 같이 작성하는 것이 더 합리적입니다.
cd -P -- "$users_dir" || exit
du ...
find . ...
$users_dir
(심볼릭 링크라면 더 일관성이 있을 것입니다)
엄밀히 말하면 말이다.적어도 $DAYSOLD
며칠 전에는그러나 비교가 나노초 정밀도로 수행되고 시작하는 데 수백 나노초가 걸린다는 점을 고려하면 find
이러한 구별은 거의 의미가 없습니다.
² 엄밀히 말하면 if workspace
가 비형식 파일인 경우목차, 해당 파일은 계속 전달되며 , 파일이 며칠 find
이상 오래된 경우 (일반 파일인 경우 ) 해당 파일도 삭제됩니다. 이 모드 로 전환 하고 추가하여 디렉터리 유형 파일만 고려되도록 할 수 있습니다. 하다$DAYSOLD
-type f
zsh
(/)
workspace
아니요추가하기만 /
하면 아래의 3이 더 심각한 결과를 초래할 수 있습니다(예: /users/joe/workspace
또는 에 대한 심볼릭 링크인 경우)./bin
/
³ 다음에는 심볼릭 링크가 따라옵니다. 예를 들어 /users/joe
심볼릭 링크인 경우 /
디렉터리 /workspace
의 오래된 파일이 삭제됩니다.
답변2
이것을 사용해보십시오
find $users_dir/user*/workspace -mtime +$DAYSOLD -type f -exec echo rm -v {} \;
기대한 대로 작동하면 에코가 줄어듭니다. 날짜를 자정부터 시작하는 것으로 처리하려면 -daystart를 추가하는 것이 좋습니다.
또 다른 쉬운 방법은 -path를 사용하는 것입니다.
find $users_dir -path "$users_dir/user*/workspace/*" -mtime +$DAYSOLD -type f -exec echo rm -v {} \;