특정 조건(파일 수, 파일 기간)에서 파일 삭제

특정 조건(파일 수, 파일 기간)에서 파일 삭제

파일 수(1시간 전의 파일)를 계산하고 1000개를 초과하면 모든 파일을 삭제하는 쉘 스크립트를 만들고 싶습니다.

읽기 및 삭제를 위해 퍼티에서 다음 명령을 사용합니다.

계산을 위해:

ls /tmp/ | grep 'ci_session*' | wc -l

파일 삭제의 경우:

cd /tmp/
find . -name "ci_session*" -exec rm {} \;

#업데이트: 삭제하려면 1시간이 지난 파일만 삭제하고 싶습니다.

여기서는 총 파일 수가 1000보다 큰 경우 조건을 추가한 다음 삭제 명령을 호출하고 싶습니다.

답변1

귀하의 질문은 "파일 수를 어떻게 계산하고 1000개가 넘는 경우 한 시간보다 오래된 파일을 삭제합니까?"로 해석됩니다.

일치하는 이름을 세어보고 /tmp/ci_session*1000개 이상이면 다음 작업을 수행하세요.

set -- /tmp/ci_session*
if [ "$#" -gt 1000 ]; then
    # something
fi

그러면 위치 매개변수가 패턴과 일치하는 이름으로 설정됩니다. 그런 다음 특수 변수에는 $#위치 인수의 수가 포함됩니다.

/tmp/ci_session*마지막으로 수정된 시간이 1시간 이상인 경우 일치하는 파일을 삭제합니다.

find /tmp -maxdepth 1 -type f -name 'ci_session*' -mmin +60 -delete

종합해보면:

#!/bin/sh

set -- /tmp/ci_session*
if [ "$#" -gt 1000 ]; then
    find /tmp -maxdepth 1 -type f -name 'ci_session*' -mmin +60 -delete
fi

여기서 주목해야 할 유일한 점은 카운트가어느패턴과 일치하는 이름(디렉토리 이름이 있는 경우에도), find명령은 삭제를 다음으로 제한합니다.일반 파일(즉, 디렉토리가 아님)

답변2

선택권이 find있는 한 다음과 같이 할 수 있습니다.-mmin

쉘 스크립트를 사용하십시오:

#!/bin/sh

files_dir=/tmp
file_count=$(find "$files_dir" -name 'ci_session*' -mmin 60 -exec echo x \; | wc -l)

if [ "$file_count" -gt 1000 ]; then
    find "$files_dir" -name 'ci_session*' -mmin 60 -exec rm {} \;
fi

file_count패턴과 일치하는 지정된 디렉터리에서 발견된 파일 수로 설정됩니다.

1000보다 크면 file_countfind를 다시 실행하고 파일을 삭제합니다.


Bash를 사용하면 배열 조회를 사용하여 두 번째 호출을 제거할 수 있습니다.

#!/bin/bash

files_dir=/tmp
mapfile -t files < <(find "$files_dir" -name 'ci_session*' -mmin 60)

if ((${#files[@]}>1000)); then
    rm "${files[@]}"
fi

참고: 예상되는 파일 수에 따라 bash 솔루션에서 명령줄 인수에 문제가 발생할 수 있습니다.한계.

관련 정보