'find -delete'가 디렉토리의 모든 파일을 재귀 적으로 삭제하는 이유


15

따라서 유닉스 찾기의 다음 동작은 비용이 많이 듭니다.

> touch foo
> touch bar
> ls  
bar  foo
> find . -name '*oo' -delete
> ls
bar
> touch baz
> ls
bar  baz
> find . -delete -name '*ar'
> ls
> #WHAAAT?

이것이 어떻게 의미가 있습니까?


2
이 질문은 관련이 있으며 향후 독자에게 흥미로울 수 있습니다. unix.stackexchange.com/questions/101282/…
베른하르트

답변:


14

find 명령 줄은 다양한 종류의 옵션으로 만들어지며, 이들은 식을 구성하기 위해 결합됩니다.

find옵션은 -delete액션이다.
이는 지금까지 일치하는 각 파일에 대해 실행됨을 의미합니다.
경로 다음의 첫 번째 옵션으로 모든 파일이 일치합니다 ... 죄송합니다!

위험하지만 맨 페이지에는 적어도 큰 경고가 있습니다 .

보낸 사람 man find:

ACTIONS
    -delete
           Delete  files; true if removal succeeded.  If the removal failed, an
           error message is issued.  If -delete fails, find's exit status  will
           be nonzero (when it eventually exits).  Use of -delete automatically
           turns on the -depth option.

           Warnings: Don't forget that the find command line is evaluated as an
           expression,  so  putting  -delete first will make find try to delete
           everything below the starting points you specified.  When testing  a
           find  command  line  that  you later intend to use with -delete, you
           should explicitly specify -depth in order to avoid later  surprises.
           Because  -delete  implies -depth, you cannot usefully use -prune and
           -delete together.


추가로 man find:

EXPRESSIONS
    The expression is made up of options (which affect overall operation rather
    than  the  processing  of  a  specific file, and always return true), tests
    (which return a true or false value), and actions (which have side  effects
    and  return  a  true  or false value), all separated by operators.  -and is
    assumed where the operator is omitted.

    If the expression contains no actions other than  -prune,  -print  is  per‐
    formed on all files for which the expression is true.


find명령이 수행 할 작업을 시도 할 때 :

명령이 어떤지 보려면

find . -name '*ar' -delete

먼저 작업을 대체 할 수있는, 삭제됩니다 -delete더 무해한 작용에 의해 - 같은 -fls또는 -print:

find . -name '*ar' -print

작업에 영향을받는 파일을 인쇄합니다.
이 예에서는 -print를 생략 할 수 있습니다. 이 경우 전혀 동작이 없으므로 가장 명백한 내용은 암시 적으로 추가됩니다 -print. (위에서 인용 한 "EXPRESSIONS"섹션의 두 번째 단락 참조)


나는 매뉴얼을 먼저 읽지 않은 것에 대한 바보라고 생각합니다. 그러나 -delete플래그를 추가하는 것이 너무 간단 해 보였습니다 :-) 그러나 누군가가 find . -delete아닌 다른 이유 가 rm -rf .있습니까? 아니면 find그 주장을 파싱하고 처리 하는 방식 입니까?
mszep

1
오, 나는 구문이 매우 위험하다는 것에 완전히 동의한다. 그러나 find의 comman line expression 구문의 특별한 경우이기 때문에 피하기 어렵다. 이것은 매우 강력하다. " 강력한 전기 톱 " 에서와 같이 강력 합니다.
Volker Siegel

인용 된 매뉴얼 페이지 warning: use -depth when testing stuff you later want to -delete에 실제 사이드 예제에서 수행하지 않은 내용이 나와 있지 않습니까?
pqnet

아, 맞아-문제는 제목이다-나는 -n옵션 처럼 -delete 대신에 인쇄의 사용을 설명하려고했다 . 물론 첫 번째 명령은 전혀 실용적이지 않아야합니다. 갈 게요
Volker Siegel

9

에서 find인수 순서는, 많은 문제.

인수는 옵션, 테스트 및 조치 일 수 있습니다. 일반적으로 옵션을 먼저 사용한 다음 테스트 한 다음 작업을 수행해야합니다.

때로는 find잘못된 순서에 대해 경고하는 경우 도 있지만 (예 : -maxdepth다른 인수 후에 사용하는 경우 ) 그렇지 않은 것 같습니다.

무엇입니까 find . -delete -name '*ar':

  1. 현재 디렉토리에서 파일 및 디렉토리를 찾습니다.
  2. 찾은대로 모두 삭제합니다!
  3. 그런 다음 이름이 '* ar'와 같은지 확인합니다 (이 부분은 현재 효과가 없습니다).

아마도 당신이하고 싶은 것은 :

find -name '*ar' -delete

모든 파일에 대해 일치 '*ar'하는지 확인하고 조건을 만족하는 경우에만 파일을 삭제합니다.

너무 늦었다면 죄송합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.