파일 수(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_count
find를 다시 실행하고 파일을 삭제합니다.
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 솔루션에서 명령줄 인수에 문제가 발생할 수 있습니다.한계.