30 일이 지난 파일을 정상적으로 삭제


8

최소 15000 개의 파일이있는 캐시 폴더가 있습니다.

나는 이것을 시도했다 :

find cache* -mtime +30 -exec rm {} \;

그러나 이로 인해 서버로드가 하늘로 날아갔습니다!

어떤 거기에 빠른 / 더 나은 해결책은?

아니면 이 명령의 속도 나 반복제한 할 수 있습니까?


1
cache*많은 파일로 확장 되면 find . -name 'cache*' -mtime +30 -exec rm {} \;대신 시도해 볼 수 있습니다 .
Jaap Eldering

답변:


10

tmpwatch이 작업 에 사용 하고 싶습니다 . 파일을 마지막으로 수정 한 시간입니다. 간단하고 많은 경우에 잘 작동합니다.

tmpwatch -m 720 /path/to/cache

우분투의 경우 tmpreaper대신 확인하십시오 .

파일에 마지막으로 액세스 한 시간을 확인하려면 다음을 사용하십시오.

tmpwatch -a 720 /path/to/cache

noatime으로 마운트 된 파일 시스템에서는 tmpwatch -a를 사용할 수 없습니다. 여전히 -m을 사용할 수 있습니다


사용 Ubuntu 10.04.2 LTS
Kristian

2
@Kristian tmpreaper대신 확인하십시오 .
slhck

noatime 옵션으로 마운트 된 파일 시스템을 관리하기 위해이를 사용할 때 어떤 문제가 있습니까?
AnonymousLurker

@AnonymousLurker 난 당신을 위해 답변을 수정했습니다
WojonsTech

6

다음을 사용하여 각 파일에 대해 새 프로세스가 생성되는 것을 피할 수 있습니다

find cache* -mtime +30 -delete

3

멋지게 위를 실행 해보십시오.

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

이렇게하면 다른 작업을 수행 할 필요가없는 경우에만 막대한로드가 표시되고, 그렇지 않으면 다른 프로세스가 우선합니다 (기쁨이 19보다 낮은 경우, 즉 최대 값).

-n 옵션에 대한 인수는 -20에서 19 사이의 기본 niceness에 추가됩니다. 39를 사용하여 원래 niceness에 관계없이 매우 좋았습니다.


2

chiborg가 언급 한 것처럼,로드는 발견 된 모든 파일에 대해 rm을 시작하기 때문입니다. 나는 tmpwatch대안으로 제안 된 답변을 보았습니다 . 확실히 잘 작동합니다. 그러나 필요하지 않습니다.

찾은 파일을 다음과 같은 인수 목록에 누적하도록 지시하면 exec에 제공된 명령을 한 번 실행할 수 있습니다.

find /path -name "*.moo" -exec rm {} \+

인수 목록이 쉘에서 허용하는 최대 값 (getconf ARG_MAX)보다 커질 수 있기 때문에 때때로 작동하지 않을 수 있습니다 (getconf ARG_MAX). 이것은 -L 옵션과 함께 xargs에 의해 해결 될 수 있습니다.

이 예제를 고려하십시오.

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

따라서 추가 소프트웨어를 설치할 필요가 없으며 gnu-findutils 만 있으면됩니다.

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 

일부 d00d는 -print0 및 -0을 추가하여 xargs를 찾는 것이 유용 할 것이라고 생각했습니다. 이러한 인수는 명령이 개행 (\ n) 대신 널 문자 (\ 0)를 사용하여 인수를 분리하도록합니다. 파일 이름에 공백이나 줄 바꿈이있을 때 유용합니다.
Ярослав Рахматуллин

(1) 말할 필요가 없습니다 \+. 평원 +이면 충분합니다. (2)“인수 목록이 커질 수 있기 때문에 작동하지 않습니다…”.  find  … -exec … {} +똑같은 일을 xargs할 것입니다. 필요한만큼 명령을 실행합니다. 예를 들어 (예에서와 같이) 15001에서 20000 사이의 파일이 있으면 'd 프로그램 ( )을 네 번 find실행합니다 . -execrm
G-Man은 'Reinstate Monica'라고
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.