특정 디렉토리에 일치하는 모든 파일을 유지하면서 파일 찾기 및 삭제

특정 디렉토리에 일치하는 모든 파일을 유지하면서 파일 찾기 및 삭제

쉽지 않을 수도 있는 흥미로운 문제가 있습니다. 저는 Linux에서 "find" 명령 옵션을 통합하는 방법을 찾으려고 노력해 왔습니다.

기본적으로 보관하거나 삭제해야 하는 파일의 여러 예가 있을 수 있는 디렉터리 트리가 있습니다. .XX 인수를 위해 모든 파일은 동일한 확장자를 공유합니다(그러나 아이디어는 가능한 한 일반적이므로 모든 파일이 될 수 있음). 파일이 특정 폴더(예에서는 항상 YYY라고 함)에 있는 위치를 제외하고 디렉터리 트리에서 모든 .XX 파일을 삭제하고 싶습니다.

다음 구조를 따라야 한다고 가정해 보겠습니다(여기서 각 하위 디렉터리에는 내가 건드리거나 영향을 주고 싶지 않은 많은 파일과 내가 사용하는 파일이 포함될 수 있습니다).

folder_root:
|
|--> Subdir_1/interesting_file_1.XX
|--> Subdir_1/interesting_file_2.XX
|--> Subdir_1/unrelated_interesting_file_1.AA
|--> Subdir_2
|--> Subdir_3/interesting_file_3.XX
|--> YYY/interesting_file_4.XX
|--> YYY//interesting_file_5.XX

나는 남고 싶다:

folder_root:
|
|--> Subdir_1/unrelated_interesting_file_1.AA
|--> YYY/interesting_file_4.XX
|--> YYY/interesting_file_5.XX

디렉터리 YYY는 어디에나 있을 수 있고 많은 디렉터리가 있을 수 있으므로 대규모 제외 목록을 작성하기 위해 수동으로 제외해야 하는 디렉터리 경로 목록을 갖는 것은 불가능합니다.

먼저 기본적인 Find작업을 수행했습니다. 그런 다음 .XX 파일이 포함된 디렉터리를 출력에 find . -iname "*.XX"추가하는 방법을 고려했습니다 . -printf "%h\n"내가 하려는 것은 출력 목록을 가져와 이를 사용하여 삭제 프로세스에 대해 알리는 것입니다(경우에 따라). grep임시 파일에 대한 출력에서 ​​YYY 폴더를 삭제하고 루프를 사용하여 while read각 하위 디렉터리 안팎으로 이동한 다음 pushd( 스위치에서 찾기 사용) 빈 디렉터리를 정리하는 간단한 방법을 사용할 수 있다고 생각했습니다. 이것으로 떠났다). 그러나 이것은 매우 큰 큰 망치를 사용하여 매우 무뚝뚝하게 느껴지며 특히 잠재적으로 수백 개의 하위 디렉터리를 처리할 때 시스템 집약적일 수 있습니다.popdfind . -iname "*.XX" -delete-empty

더 유연하고 전체적으로 덜 집중적이며 안정적인 "더 나은" 접근 방식이 있는지 궁금합니다(특히 3~4개의 다른 파일 형식에 대해 3~4회 실행해야 하는 경우).

아마 아닐 수도 있지만, 한번 물어볼 가치가 있습니다 :) 간단한 망치로도 괜찮을텐데 큰 망치를 사용하는 이유는 무엇입니까? ? :)

마지막으로 시스템에 추가 셸 명령을 추가할 수 없으므로(내가 사용하는 시스템은 Ubuntu와 Centos가 혼합되어 있음) 가능하면 기존 명령 세트를 사용해야 합니다(다른 명령이 없다고 가정). Tree 외에 모듈이 설치되어 있음), 알고 있습니다). 나는 이 질문이 간단한 대답을 찾는다면 다양한 상황에서 다른 사람들에게 유용할 만큼 명확하고 "일반적"이기를 바랍니다.

답변1

find가 전체 경로 이름을 생성하므로 Pushd Popd 등이 필요하다고 생각하지 않습니다.

파일 이름에 캐리지 리턴과 별표가 포함되어 있으면 모든 readline 방법은 흥미로운 결과를 생성합니다.

일반적인 해결책은 find를 사용하여 모든 후보의 null 종료 목록을 생성하고, grep winnow를 사용하고, xargs를 사용하여 실행하는 것입니다.

find . -iname "*.XX" -print0 | grep -vzf keep_these.txt | xargs -0 echo rm -- # remove the echo to ACTUALLY delete files

"keep_these.txt"는 선행 및 후행 슬래시를 포함하여 한 줄에 하나씩 제외할 디렉터리 목록입니다. 예:

/YYY/ 
/I love this directory/

디렉터리를 식별하기 위해 정규식이 필요하지 않은 경우(단지 고정 문자열) -Fgrep에 추가하세요.

답변2

이것은 작동합니다:

find folder_root/ -name Subdir_2 -prune -o -name Subdir_3 -prune -a -type f

올바른 파일 세트가 발견되면 이를 -delete명령 끝에 추가할 수 있습니다 find.

관련 정보