n 일보다 오래된 디렉토리를 삭제하는 쉘 스크립트


165

다음과 같은 이름의 디렉토리가 있습니다.

2012-12-12
2012-10-12
2012-08-08

bash 쉘 스크립트를 사용하여 10 일보다 오래된 디렉토리를 어떻게 삭제합니까?


1
실제 제작 / 수정 시간과 관련이 있습니까? find그때 이름을 보지 않고 그것을 할 수 있기 때문에 ...
Wrikken

그들은뿐만 아니라 그들에 생성 / 수정 시간을 가져야한다
bobsr

4
"보다 오래된"은 무슨 뜻입니까? 디렉토리가 작성된 시간, 내용이 마지막으로 변경된 시간 또는 다른 것을 언급하고 있습니까? 아래 답변 중 일부에주의하십시오. ctimeinode 변경 시간입니다. 디렉토리의 경우 파일이 디렉토리에서 추가되거나 제거 될 때 변경됩니다.
ajk

답변:


390

이것은 당신을 위해 재귀 적으로 할 것입니다 :

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;

설명:

  • find: 파일 / 디렉토리 / 링크 등을 찾기위한 unix 명령
  • /path/to/base/dir: 검색을 시작할 디렉토리입니다.
  • -type d: 디렉토리 만 찾습니다
  • -ctime +10: 수정 시간이 10 일보다 오래된 것만 고려하십시오.
  • -exec ... \;: 발견 된 각 결과에 대해 다음 명령을 수행하십시오. ...
  • rm -rf {}: 재귀 적으로 디렉토리를 강제로 제거합니다. {}찾기 결과가 이전 부분에서로 대체됩니다 어디 부분이다.

또는 다음을 사용하십시오.

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf

다음과 같은 이유로 조금 더 효율적입니다.

rm -rf dir1 dir2 dir3 ...

반대로 :

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...

-exec방법 에서와 같이 .


현대 버전으로 find, 당신은을 대체 할 수 ;+그리고 그것은에 해당 할 것입니다 xargs각 간부 시스템 호출에 맞는 많은 파일로 통과, 당신을 위해 전화 :

find . -type d -ctime +10 -exec rm -rf {} +

12
-mtime권한 변경이 아닌 콘텐츠 변경을 확인하는 것이 나에게 더 좋았습니다. 그렇지 않으면 완벽했습니다.
quickshiftin

7
나는 이것이 또한 기본 디렉토리 자체를 삭제한다고 생각합니다
또는 Gal

3
@ Orgal 당신은 절대적으로 정확합니다. 이를 방지하려면 다음을 사용하십시오 find /path/to/base/dir/*.
zloynemec

11
-maxdepth 1을 사용하여 디렉토리의 내용을 무시할 수 있습니다.
Sam

7
: 삭제 너무 많은 폴더가있는 경우보다 효율적인 접근 방법은 역효과를 낳을 수 stackoverflow.com/questions/11289551/...을 . 같은 이유로 기본 폴더의 삭제를 피하기 위해 -mindepth 1(대신 /path/to/folder/*) 를 사용하는 것이 좋습니다 .
하드 슈나이더

41

/path/to/base예를 들어 아래의 모든 하위 디렉토리를 삭제하려면

/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3

하지만 루트를 삭제하지 않으려면 /path/to/base추가 -mindepth 1-maxdepth 1옵션 을 추가해야합니다.이 옵션은 아래의 하위 디렉토리에만 액세스합니다./path/to/base

-mindepth 1/path/to/base일치 하는 루트 를 제외합니다 .

-maxdepth 1됩니다 바로 아래 서브 디렉토리와 일치 /path/to/base등을 /path/to/base/dir1, /path/to/base/dir2그리고 /path/to/base/dir3하지만하지 않습니다 재귀 방식으로이 목록의 하위 디렉토리. 따라서 다음 예제 서브 디렉토리는 나열되지 않습니다.

/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1

기타 등등.

따라서 /path/to/base10 일보다 오래된 모든 하위 디렉토리를 삭제합니다 .

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf

19

find-delete작동을 지원 합니다.

find /base/dir/* -ctime +10 -delete;

파일이 10 일 이상 더 오래 걸렸다는 생각이 들었습니다. 시도하지 않은 사람은 의견을 확인할 수 있습니다.

여기에서 가장 많이 투표 된 솔루션이 누락 -maxdepth 0되어 rm -rf삭제 후 모든 하위 디렉토리를 호출 합니다. 그것은 말이되지 않으므로 제안합니다.

find /base/dir/* -maxdepth 0  -type d -ctime +10 -exec rm -rf {} \;

디렉토리가 비어 있지 않다고 불평 -delete하기 -maxdepth 0때문에 위 의 솔루션은 사용하지 않습니다 find. 대신 -depth아래에서 위로 암시 하고 삭제합니다.


나는 -delete작품 을 확인할 수 있지만, 당신이 말했듯이 빈 디렉토리를 삭제하는 데만 사용할 수 있습니다 rmdir.
CTodea

3

위에 제공된 스크립트와 특히 파일 및 폴더 이름에 줄 바꿈이나 공백이있는 경우 다른 스크립트를 사용 하여이 권리를 얻는 데 어려움을 겪고있었습니다.

마침내 tmpreaper가 우연히 발견되었으며 지금까지 우리에게 꽤 잘 작동했습니다.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

원본 소스 링크

디렉토리를 재귀 적으로 확인하고 나열하는 test와 같은 기능이 있습니다. 삭제하는 동안 심볼릭 링크, 파일 또는 디렉토리를 삭제하는 기능 및 특정 패턴에 대한 보호 모드


2

또는

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

업데이트되고 더 빠른 버전 :

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f

2
이것은 최대 명령 줄 길이를 쉽게 초과 할 수 있습니다. 참조하십시오 xargs --show-limits.
Michael Krupp

2
공백이나 다른 특수 쉘 문자가 포함 된 파일 이름이있는 경우에도 작동하지 않습니다.
Martin Tournoij

@Carpetsmoker -print0/ -0는 특별한 쉘 문자를 처리하지 않습니까?
mpen

당신은 xargs버전이 @mpen 인 것이 맞지만 첫 번째 줄은 그렇지 않습니다.
Martin Tournoij
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.