Unix는 30일이 지난 파일과 폴더를 삭제하지만 특정 디렉터리와 그 안에 중첩된 파일/폴더는 건너뜁니다.

Unix는 30일이 지난 파일과 폴더를 삭제하지만 특정 디렉터리와 그 안에 중첩된 파일/폴더는 건너뜁니다.

특정 경로에서 30일이 지난 모든 파일과 디렉터리를 삭제하는 방법을 찾으려고 합니다. 하지만 해당 경로에는 삭제하거나 수정하고 싶지 않은 특정 디렉터리가 있습니다. 나는 -prune을 읽었지만 제대로 작동하지 않는 것 같습니다. 지금까지 시도한 명령은 다음과 같습니다.find "<path to directory" -prune -o -name "<name of excluded directory" -type f -mtime +30 -exec rm {} +

답변1

명령 논리가 find혼란스러운 것 같습니다. 이름이 지정된 디렉토리를 제외하고 파일 이름을 인쇄하려면 excludeme다음과 같이 작성할 수 있습니다.

find /path/to/top/directory -name excludeme -prune -o -type f -print

이는 -o논리이므로 OR유효한 조건은 명령 -prune-o같은 쪽에 있어야 합니다 -prune.

이를 염두에 두고 우리는 다음과 같이 결론을 내립니다.

find "<path to directory" \
  -name "<name of excluded directory> -prune -o \
  -type f -mtime +30 -exec rm {} +

답변2

한 단계 방법

파일뿐만 아니라 모든 파일과 디렉터리를 삭제하려면 해당 디렉터리 트리에 있는 파일과 디렉터리뿐만 아니라 디렉터리 자체를 보호해야 합니다. (파일을 삭제했다면 문제가 더 쉬울 것입니다.) 이 작업은 다음과 같이 수행할 수 있습니다.

다음 파일 구조(다른 테스트 예에서 차용)를 가정해 보겠습니다.

$ find
.
./tarfile
./work
./work/file1
./work/dir 4
./work/dir 4/file 1
./work/file2
./work/dir5
./work/dir5/sub1
./work/dir5/sub2
./work/ttt
./work/dir1
./work/dir1/file1
./work/dir1/file2
./work/dir1/file 3
./work/dir2
./work/dir2/file1
./work/dir2/file2
./work/dir3
./work/dir3/file1
./work/dir3/file2
./work/dir3/file3
./work/rsync-by-folder
./backup
./backup/dir 4
./backup/dir 4/file 1
./backup/dir1
./backup/dir1/file1
./backup/dir1/file2
./backup/dir1/file 3
./backup/dir2
./backup/dir2/file1
./backup/dir2/file2
./backup/dir3
./backup/dir3/file1
./backup/dir3/file2
./backup/dir3/file3

다음 명령줄은 디렉터리 ./work/dir2(및 해당 경로)를 제외하고 다른 모든 항목(파일 및 디렉터리)을 삭제합니다.

$ find . -mindepth 1 -maxdepth 2 -mtime +45 -not \( -path ./work -or -path './work/dir2' \) -exec echo rm -r {} +

또는 ( rm인스턴스당 하나의 행에 대해)

$ find . -mindepth 1 -maxdepth 2 -mtime +45 -not \( -path ./work -or -path './work/dir2' \) -exec echo rm -r {} \;
rm -r ./work/file1
rm -r ./work/dir 4
rm -r ./work/file2
rm -r ./work/dir5
rm -r ./work/ttt
rm -r ./work/dir1
rm -r ./work/dir3
rm -r ./work/rsync-by-folder
rm -r ./backup
rm -r ./backup/dir 4
rm -r ./backup/dir1
rm -r ./backup/dir2

2단계 방법

잠재적으로 더 안전한 대안은 두 단계로 수행하는 것입니다(find 명령줄을 설정할 때 오류가 발생할 위험이 적음). 첫 번째 단계는 원래 질문과 첫 번째 답변에 이미 표시된 것과 일치하며, 보호해야 하는 디렉터리 트리 외부의 파일을 삭제합니다. 내 경우에는 일치합니다.

$ find . -mtime +45 -not -path '*/dir2/*' -type f -exec rm -r {} +

다음 파일과 디렉터리를 유지하세요.

$ find -printf "%y %p\n"
d .
f ./tarfile               # too new (dangerous location if important to keep)
d ./work
d ./work/dir 4
d ./work/dir5
d ./work/dir5/sub1
d ./work/dir5/sub2
d ./work/dir1
d ./work/dir2
f ./work/dir2/file1
f ./work/dir2/file2
d ./work/dir3
d ./backup
d ./backup/dir 4
d ./backup/dir1
d ./backup/dir2
f ./backup/dir2/file1
f ./backup/dir2/file2
d ./backup/dir3

이제 빈 디렉토리를 삭제합니다. 다음 방법은 복잡하지 않으며 전체 빈 디렉터리 트리가 삭제될 때까지 반복해야 합니다. 보다 직접적인 방법에 대한 제안을 환영합니다. 이 rm옵션은 -d빈 디렉터리를 삭제합니다.

find -type d -exec rm -d {} +

어떤 사람들은 일부 디렉토리가 비어 있지 않다고 불평할 것입니다. 우리는 다음과 같은 결과를 얻습니다.

$ find -printf "%y %p\n"
d .
f ./tarfile
d ./work
d ./work/dir5             # This is an empty directory
d ./work/dir2
f ./work/dir2/file1
f ./work/dir2/file2
d ./backup
d ./backup/dir2
f ./backup/dir2/file1
f ./backup/dir2/file2

반복하다:

find -type d -exec rm -d {} +

결과를 확인하십시오.

$ find -printf "%y %p\n"
d .
f ./tarfile               # too new (dangerous location if important to keep)
d ./work
d ./work/dir2
f ./work/dir2/file1
f ./work/dir2/file2
d ./backup
d ./backup/dir2
f ./backup/dir2/file1
f ./backup/dir2/file2

이제 디렉터리 트리에는 보호해야 하는 항목만 포함됩니다.

관련 정보