찾기: 폴더 및 하위 폴더를 삭제하지만 두 파일에 대한 예외를 추가합니다.

찾기: 폴더 및 하위 폴더를 삭제하지만 두 파일에 대한 예외를 추가합니다.

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알지 않는 한 전화하지 마십시오. 스크립트에서 읽기 전용 파일 삭제에 대한 확인을 요청하지 않도록 하려면 여기에 보장이 있지만 분명히 보장할 수는 없습니다.rmrm -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비어 있지 않은 디렉토리에서 실행하면 오류가 발생합니다. 오류는 짜증나지만 무해합니다.

찾기에 -deleteand (예: GNU find)가 있는 경우 and 를 -empty호출할 필요가 없습니다 .rmrmdir

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

관련 정보