파일을 반복하고 x일보다 오래되었지만 사용되지 않는 파일을 삭제하는 방법

파일을 반복하고 x일보다 오래되었지만 사용되지 않는 파일을 삭제하는 방법

그래서 나는 이것 중 일부를 스스로 알아낼 수 있었지만 그것을 모두 하나로 모으기가 어려웠습니다. 자동화해야 하는 작업이 있습니다. 폴더에 기가바이트 단위의 오래된 파일이 가득 있는데, 두 가지 조건을 충족하면 해당 파일을 제거하고 싶습니다.

  1. 파일은 지난 14일 동안 수정된 적이 없어야 합니다. 이를 위해 저는 find를 사용합니다.

find /dir/* -type f -mtime +14

  1. 파일을 사용할 수 없는 경우 이는 다음을 통해 확인할 수 있습니다.

lsof /dir/*

나는 이러한 명령을 결합하는 방법을 알아낼 만큼 bash를 아직 잘 모릅니다. 어떤 도움이라도 대단히 감사하겠습니다. 나는 본질적으로 find 출력의 각 줄을 반복하여 lsof 출력에 있는지 확인하고 그렇지 않은 경우 rm -f를 수행하고 싶다고 생각합니다. 그러나 목표를 달성하면 대안이 열려 있습니다!

답변1

다음이 작동합니다.

for x in `find <dir> -type f -mtime +14`; do lsof "$x" >/dev/null && echo "$x in use" || echo "$x not in use" ; done

echo "$x not in use"명령 대신 명령을 입력할 수 있습니다 rm "$x".

작동 방식:

  • 마지막으로 수정된 지 14일 이상 지난 파일 찾기:

find <dir> -type f -mtime +14

  • 목록의 항목을 반복합니다.

for x in <list>; do <command>; done

  • lsof결과가 다음과 같으면 명령 2를 실행하고 0, 그렇지 않으면 명령 1을 실행합니다.

lsof "$x" && <command 1> || <command 2>

이는 다음에 따라 달라집니다.게으른 평가Bash는 명령 1 또는 명령 2를 실행합니다.

내 시스템(Ubuntu 14.04)에서는 공백이 포함된 파일 이름과 ?공백이 포함된 파일 이름에도 작동합니다. 그러나 이것이 모든 시스템의 모든 쉘에서 작동한다는 것을 보장하지는 않습니다. 명령을 명령으로 바꾸기 전에 테스트해 보십시오.*
echorm

답변2

-execfind의 작업을 사용하여 각 파일에 대해 명령을 실행합니다. 이는 인수를 사용하여 프로그램을 실행합니다. 더 복잡한 명령(변수 확장, 조건 등)이 필요한 경우 명시적으로 셸을 호출해야 합니다.

find /dir/* -type f -mtime +14 -exec sh -c '
  if …; then
    rm "$0"
  fi
' {} \;

파일이 현재 열려 있는지 테스트하려면 가장 간단한 방법은 다음을 호출하는 것입니다.fuser.

find /dir/* -type f -mtime +14 -exec sh -c '
  if ! fuser "$0" >/dev/null 2>/dev/null; then
    rm "$0"
  fi
' {} \;

파일이 오랫동안 수정되지 않았고 현재 열려 있지 않다고 해서 그것이 유용하지 않다는 의미는 아닙니다. 적어도 한동안 파일을 읽지 않았는지 테스트하는 것이 좋습니다. 이는 액세스 시간으로 테스트할 수 있지만 Linux 시스템은 액세스 시간을 안정적으로 업데이트하지 않는다는 점에 유의하세요. (커널 버전, 마운트 옵션, 수정 시간 대비 접근 시간에 따라 실행 여부와 빈도가 달라집니다.)

파일을 삭제하기 전에 확인하는 것이 좋습니다.

find /dir/* -type f -mtime +14 -atime +14 -exec sh -c '
  if ! fuser "$0" >/dev/null 2>/dev/null; then
    echo "$0"
  fi
' {} \; >files-to-delete-potentially.txt

파일 이름을 확인하고 보관하려는 파일을 삭제하세요. 그런 다음 모든 파일 이름에 개행 문자가 포함되어 있지 않다고 가정하고 모두 삭제하려면 다음을 사용할 수 있습니다.

<files-to-delete-potentially.txt tr '\n' '\0' | xargs -0 rm

답변3

lsof악몽 같은 옵션과 흥미로운 구문 분석 출력이 있는 대신 or 옵션을 사용하는 것이 좋습니다 . 이를 통해 파일 액세스 시간(일 또는 초 단위)을 개별적으로 지정할 수 있습니다.-atime-aminfind

파일이 현재 "사용 중"인지 확인하기 위해 다른 프로세스를 사용하는 대신 지난 N초 또는 며칠 동안 파일에 액세스했는지 확인할 수 있습니다.

다음 명령은 수정된 지 14일이 넘었고 액세스된 시간이 60초 미만인 모든 파일을 나열합니다.

find "$dir" -type f -mtime +14 -amin -60

find이 기준을 충족하는 파일을 삭제하려면 명령 을 사용할 수 있습니다 -exec command ;. 이상한 점은 각 명령 매개변수를 개별적으로 지정하고 ;세미콜론()으로 끝내는 것입니다. 인수에 존재하는 경우 {}처리 중인 파일 이름으로 대체됩니다.

이 명령은 생성된 지 14일이 넘었고 지난 60분 동안 액세스되지 않은 모든 파일을 삭제합니다.

find "$dir" -type f -mtime +14 -amin -60 -exec rm '{}' \;

관련 정보