X 시간보다 오래된 파일을 삭제하는 방법


191

오래된 파일을 삭제 해야하는 bash 스크립트를 작성 중입니다.

현재 다음을 사용하여 구현되었습니다.

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

1 일이 지난 파일은 삭제됩니다.

그러나 하루보다 세밀한 해상도가 필요하다면 6 시간이 지나면 어떻게 되나요? find와 -mtime을 사용하는 것처럼 좋은 깨끗한 방법이 있습니까?

답변:


303

당신이 있습니까 find-mmin옵션을? 최종 수정 이후의 분 수를 테스트 할 수 있습니다.

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

또는 tmpwatch동일한 작업을 수행하기 위해 사용 을 살펴보십시오 . tmpreaper의견에서 phjr도 추천 했다.


2
--mmin + X를 사용하면 찾은 모든 파일이 반환됩니다. 이것을 먼저 확인하지 않은 내 잘못이지만이 명령은 대부분의 내 홈 디렉토리를 삭제했습니다. 나를 위해 --mmin -X가 올바른 인수입니다.
brandones

tmpreaper 는 tmpwatch의 포크입니다. 더 안전하고 배포판에 데비안 패키지로 존재합니다. find -delete의 장점 : tmpreaper는 심볼릭 링크, 소켓, fifo 또는 특수 파일을 제거하지 않습니다.
Nadir

$ REQUIRED_FILES는 따옴표 (큰 따옴표)로 묶어야 하며 모든 .txt 파일 또는 "temp- " 와 같은 패턴으로 시작하는 파일에 대해 " .txt" 와 같은 패턴을 사용할 수 있음을 지적 하십시오. temp로 이름이 지정된 모든 파일을 삭제하려면 -
achasinh

@PaulDixon 어떻게 그래서이 문제를 수정 $LOCATION하고 $REQUIRED_FILES모두 같은 여러 값을 가질 수 dir1 dir2*.txt *.tmp?
Enissay

@Enissay $ LOCATION은 단일 디렉토리입니다. 여러 확장 프로그램의 경우 -regex 패턴을 사용하고 싶을 것입니다. – stackoverflow.com/questions/5249779/…
Paul Dixon

9

이 트릭을 할 수 있습니다 : 1 시간 전에 파일을 만들고 -newer file인수를 사용하십시오 .

(또는 touch -t그러한 파일을 만드는 데 사용 하십시오).


1
-older 스위치는 없지만 (적어도 find 명령에는) 이것이 필요한 것입니다. -새로운 도움이되지 않습니다.
iconoclast

-mmin을 사용할 수없는 기계에서 작동하는 1 시간짜리 파일을 생성하는 터치 명령을 줄 수 있습니까? (리눅스라면 -mmin을 사용할 수 있습니다. 그렇지 않으면 날짜와 다른 명령도 비교할 수 없습니다.)
iconoclast

2
@iconoclast 항상 1 시간이 지난 touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) test파일 test을 만듭니다 .
rovr138

4

여기 나를 위해 일한 접근법이 있습니다 (그리고 위에서 사용 된 것을 보지 못했습니다)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

폴더를 그대로 유지하면서 59 분보다 오래된 모든 파일을 삭제합니다.


작은 따옴표 '*.*'또는 셸을 사용 find하면 해결하기 위해 와일드 카드로 유지하지 않고 실제 파일 이름으로 확장 할 수 있습니다. find하위 디렉토리에서의 재귀 작업 이 중단 됩니다.
MestreLion

또한 -name '*.*'확장자가없는 파일 (예 : README, 등)은 삭제하지 않습니다 Makefile.
MestreLion

1

SunOS 5.10의 경우

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.

0

-mmin은 몇 분 동안입니다.

매뉴얼 페이지를보십시오.

man find

더 많은 유형.


0

"find"버전에 "-mmin"이없는 경우 "-mtime -0.041667"은 "지난 1 시간 이내"와 매우 비슷해 지므로 다음과 같이 사용하십시오.

-mtime +(X * 0.041667)

따라서 X가 6 시간을 의미하는 경우 :

find . -mtime +0.25 -ls

24 시간 * 0.25 = 6 시간이므로 작동


이 오래된 유닉스에는 -mmin이 없기 때문에 희망적 이었지만 슬프게도이 오래된 유닉스는 mtime에 대한 분수 값을 좋아하지 않기 때문에 도움이되지 않습니다. 2147483647
kbulgrien

0

@iconoclast가 다른 답변 에 대한 의견 에서 궁금해하는 방식으로 진행할 수있는 작업은 다음과 같습니다 .

사용자 또는 crontab을 사용 /etc/crontab하여 파일을 만듭니다 /tmp/hour.

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

그런 다음 이것을 사용하여 명령을 실행하십시오.

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

*/1crontab에서 시간당 중복됩니다. 시간 필드에 *를 넣는 것과 같습니다.
colm.anseo 2018 년

0

find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;


0

하나의는 경우 find가없는 -mmin한도에 붙어있는 경우 find에만 값 정수 받아 그 -mtime, 모든 필요 하나가 "이전의"가 "보다 새로운"과 유사하다고 판단하는 경우 손실되지 않습니다.

컷오프 시간이 mtime 인 파일을 작성할 수있는 경우 find참조 파일보다 최신이 아닌 파일을 찾 도록 요청할 수 있습니다 .

적절한 타임 스탬프가있는 파일을 만드는 것은 다소 복잡하기 때문에 시스템이 적절하지 않은 시스템 find에는 다음 date과 같은 작업을 수행 할 수있는 명령 보다 적을 수도 있습니다 date +%Y%m%d%H%M%S -d "6 hours ago".

다행스럽게도이를 관리 할 수있는 다른 오래된 도구는 다루기가 쉽지 않습니다.

6 시간은 21600 초입니다. 6 시간 전의 시간을 유용한 형식으로 찾고 싶습니다.

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

펄 문장은 유용한 날짜를 만들어 냈지만 더 잘 사용해야합니다.

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

이 오래된 유닉스에 대한 해결책은 다음과 같습니다.

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

참조 파일을 정리하는 것이 좋습니다.

$ rm -f ref_file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.