파일 이름과 디렉토리를 삭제하십시오. 그러한 파일이나 디렉토리가 없습니다


32

컴파일 된 모든 데이터를 삭제해야합니다.

  • 라는 디렉토리 build,
  • 라는 디렉토리 obj,
  • * .so 파일.

나는 명령을 썼다

find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;

모든 디렉토리를 재귀 적으로 살펴보고 필요한 모든 것을 삭제합니다.

마지막에 왜 그런 출력이 있습니까? 다른 명령을 작성해야 할 수도 있습니다.

find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory

당신은 어떤 시스템에 있습니까? 당신은 항상 사용해야 find과 같이 find /search_directory options검색 디렉토리가 좋은 생각이 아니다 omiting
— Kiwy

이와 같은 자동 삭제는 나쁜 생각입니다. 스크립트가 후보를 제공하도록하여 시스템에 중요하거나 필요한 것을 삭제하지 않는지 확인해야합니다. 어디에서 실행하고 있는지 명확하지 않습니다. 사용자 공간에서만이 작업을 수행하는 경우 많은 해를 끼칠 수 없다고 생각하지만 실수로 시스템 영역 에서이 작업을 수행하지 않아야합니다. 당신은 분명히 사용자와 같은 스크립트를 실행하고 싶습니다.
— Faheem Mitha

@ Kiwy, @ FaheemMitha, 명령은 프로젝트 지시에만 사용됩니다. 거기에는 아무런 해가 없습니다.
— Maksim Dmitriev

답변:


54

-prune어쨌든 삭제할 디렉토리 find에서 파일을 찾으려고 귀찮게하지 말라고 사용하십시오 .

find . \( -name build -o -name obj -o -name '*.so' \) -prune -exec rm -rf {} +

또한주의 *.so그렇지 않으면 목록에 쉘에 의해 확장 될 수 있으므로 필요에 인용되는 .so현재 디렉토리에있는 파일.

GNU -regex유형 과 동등한 것은 다음과 같습니다 .

find . \( -name build -o -name obj -o -name '*?.so' \) -prune -exec rm -rf {} +

GNU 특정 구문을 사용하려는 경우 -delete대신 대신 사용할 수도 있습니다 -exec rm -rf {} +. 를 사용 -delete하면 GNU find가 -depth자동으로 켜집니다 . 외부 명령을 실행하지 않으므로 더 효율적이며 시간 사이에 디렉토리를 심볼릭 링크로 변경하여 누군가 잘못된 파일을 제거 할 수있는 경쟁 조건을 제거하므로 더 안전합니다. find파일을 찾아서 rm제거합니다 ( info -f find -n 'Security Considerations for find'자세한 내용 참조).

find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+\.so)' -delete

-delete또한 공간과 같은 것들을 더 잘 처리합니다
— Izkata

@ Izkata는 그중에서도 -exec rm -rf {} +문제가되지 않는 것보다 낫습니다 .
— Stéphane Chazelas

@StephaneChazelas-혼란스러워 {}-인용해야합니까? 따옴표없이 작동하는 것처럼 보이지만 GNU Findutils Manual 은 '{}'예제를 사용합니다 . 명확하게 설명해 주시겠습니까?
— grebneke

1
@grebneke, 나는 매우 오래된 버전에서 따옴표가 필요할 수 있다고 주장하는 게시물이 있다고 생각 csh하지만 그 주장을 확인할 수는 없습니다. 내가 아는 현대 쉘에는 필요하지 않습니다. POSIX에는 반드시 필요하지 않습니다. POSIX 예제 를 사용하지 마십시오.
— Stéphane Chazelas

3
그리고 -delete디렉토리와 함께 사용할 수 없습니다.
— St0rM

8

그 이유는 find디렉토리 트리를 먼저 삭제하고 가능한 최선의 순서가 아닌 디렉토리 내용을 확인하려고하기 때문입니다. find먼저 내용을 확인 하도록 할 수 있습니다 .

find . -depth ...

-delete파일 및 -exec rmdir디렉토리 사용 을 고려해야 합니다 .


0

내 솔루션.

find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -prune -exec rm -rf {} +

+ vs \; -exec 명령에서


삭제 된 디렉토리 내에서 실행 사이에 경계가없는 경우에만 항상 작동하지는 않습니다.
— 질 'SO-정지 존재 악마'

@Gilles, "실행 사이의 경계"란 무엇을 의미합니까?
— Maksim Dmitriev의

1
-exec … {} +명령 줄에 맞는만큼 여러 파일에 대해 명령을 한 번에 실행합니다. 파일이 너무 많으면 (또는 전체 경로 길이가 너무 길면) find여러 인스턴스를 실행 rm하므로 통과하는 디렉토리가 제거 될 수 있습니다. 와 +보다 가능성이 적지 ;만 +문제를 해결하지는 않습니다.
— Gilles 'SO- 악의를 멈추십시오'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.