이 시나리오를 테스트하려고 하는데 다음 파일이 있습니다.
/encoded
encode <~~~ a bash script
/dir1
/dir2
.../dir2-sub
test.meta
내가 원하는 것은 find
현재 (제외) 인코딩의 모든 디렉토리를 검색하고 모두 삭제하는 것입니다.
결국 이 스크립트를 사용하게 되었습니다.
find . -name encoded -prune -o -maxdepth 10 ! -name 'encode*' ! -name '.*' | xargs rm -rf
내가 생각하는 것은 폴더를 표시 encoded
한 -prune
다음 무시하는 것입니다. 그렇죠? 그런 다음 확장이 없는 다른 항목에 대해서는 이를 제거하여(이렇게 하면 모든 디렉터리가 보장됩니다)rm
그런데 문제는... 확장자가 없는 bash 스크립트도 있어서 결국 삭제됐네요.
내 Bash 스크립트가 위에서 설명한 것과 정확히 같은 구조를 갖기를 원합니다. (디렉토리가 아닌 모든 파일은 그대로 유지하고, /encoded 폴더와 그 내용을 건드리지 말고, 인코딩된 bash 스크립트를 제거하지 마십시오.)
/encoded
encode <~~~ a bash script
test.meta
위 결과를 어떻게 얻을 수 있나요?
답변1
이 작업을 수행하기 위해 디렉터리를 반복적으로 열거할 필요는 없습니다 rm -rf
. 삭제하려는 최상위 디렉터리만 나열하면 됩니다. 디렉토리 항목이 파일이 아닌 디렉토리인지 확인하려면 find
의 -type d
테스트 를 사용하는 것이 .
좋은 지표가 아닙니다.
다음이 도움이 될 것입니다:
find * -maxdepth 0 ! -name encoded -type d -print0 | xargs -0 rm -rf
이는 현재 디렉토리의 모든 항목으로 시작하여(목록을 피하기 위해 .
) 이름이 지정된 모든 항목을 제거하고 encoded
디렉토리만 남겨두고 null을 구분 기호로 사용하여 결과를 출력하고 결과를 xargs
Give to 에 제공합니다 rm -rf
. 이 변형을 실행하기 전에 다음을 시도해 보십시오.
find * -maxdepth 0 ! -name encoded -type d
출력이 예상과 일치하는지 확인하십시오.
-prune
일치 항목을 무시하는 대신 일치 항목에 빠지는 것을 방지하므로 예제에서는 encoded
계속 나열한 다음 test 로 필터링합니다 -name
.