find
이 명령을 사용하여 다음 작업을 수행하려고 합니다 .
파일, 폴더 및 하위 폴더(파일 2개 제외)가 포함된 전체 폴더를 삭제합니다. 다음은 필요한 항목의 예입니다.
test/folder1/file1.txt
test/folder1/file2.txt
test/folder1/subfolder1/
test/folder1/subfolder1/file3.txt
test/folder1/subfolder1/subfolder2/file4.txt
test/folder2/file5.txt
test/folder3/file6.txt
및를 제외한 file2.txt
모든 항목을 제거해야 합니다.file3.txt
이것이 내가 한 일이다
find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt'
내가 지정한 파일을 제외한 모든 파일이 나열됩니다. 그러나 -exec rm -rf {}
명령 끝에 추가하면 모든 것이 제거됩니다.
나는 또한 성공하지 못한 채 다른 명령을 시도했습니다
rm -r test/folder1/ !(file2.txt|file3.txt)
정규식에 대해 잘 모르기 때문에 온라인에서 찾은 명령을 테스트하여 작동하게 하려고 했지만 아무 것도 작동하지 않는 것 같았습니다.
답변1
전화하지 마세요 rm -rf
. 디렉터리에서 실행하면 해당 디렉터리와 하위 디렉터리의 모든 파일, 심지어 유지하려는 파일도 삭제됩니다. 더 일반적으로 말하면, 쉬운 방법이 왜 작동하지 않는지 rm -rf
알지 않는 한 전화하지 마십시오. 스크립트에서 읽기 전용 파일 삭제에 대한 확인을 요청하지 않도록 하려면 여기에 보장이 있지만 분명히 보장할 수는 없습니다.rm
rm -f
-r
파일만 삭제:
find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a -exec rm -f {} +
비어 있는 디렉토리도 삭제하려면 rmdir
이 호출을 호출하십시오. -depth
디렉터리 자체보다 디렉터리 내용을 고려하는 데 사용합니다 .
find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a \( -type d rmdir {} \; -o -exec rm -f {} \; \)
rmdir
비어 있지 않은 디렉토리에서 실행하면 오류가 발생합니다. 오류는 짜증나지만 무해합니다.
찾기에 -delete
and (예: GNU find)가 있는 경우 and 를 -empty
호출할 필요가 없습니다 .rm
rmdir
find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a ! -type d ! -empty -delete
답변2
옵션을 사용하여 이 작업을 수행하는 방법도 모르지만 find
쉘 스크립트를 사용할 수도 있습니다 find
.
먼저 파일을 삭제하세요.
find . -type f -exec bash -c \
' [[ "{}" == "./test/folder1/file2.txt" || \
"{}" == "./test/folder1/subfolder1/file3.txt" ]] \
|| rm "{}" ' \;
그런 다음 비어 있지 않은 폴더를 모두 삭제합니다.
find . -type d -exec rmdir {} \; 2>/dev/null