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


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.