"find -delete"가 디렉터리의 모든 파일을 반복적으로 삭제하는 이유는 무엇입니까?

"find -delete"가 디렉터리의 모든 파일을 반복적으로 삭제하는 이유는 무엇입니까?

따라서 다음과 같은 Unix find 동작으로 인해 막대한 비용이 발생했습니다.

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

점은 무엇인가?

답변1

찾기 명령줄은 표현식을 형성하기 위해 결합된 다양한 유형의 옵션으로 구성됩니다.

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. (위에 인용된 "표현식" 섹션의 두 번째 단락 참조)

답변2

find논쟁 에서는 순서가 중요합니다.

매개변수는 옵션, 테스트, 작업이 될 수 있습니다. 일반적으로 옵션을 먼저 사용한 다음 테스트를 사용한 다음 작업을 사용해야 합니다.

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

이것이 하는 일은 find . -delete -name '*ar':

  1. 현재 디렉터리에서 파일과 디렉터리를 찾습니다.
  2. 찾으면 모두 삭제하세요!
  3. 그런 다음 이름이 "*ar"인지 확인하세요(이 부분은 현재 작동하지 않음).

당신이 하고 싶은 일은 다음과 같습니다:

find -name '*ar' -delete

그러면 각 파일과 일치하는 항목을 찾아 '*ar'조건이 충족되는 경우에만 파일을 삭제합니다.

너무 늦게 알았다면 죄송합니다.

관련 정보