따라서 다음과 같은 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'
:
- 현재 디렉터리에서 파일과 디렉터리를 찾습니다.
- 찾으면 모두 삭제하세요!
- 그런 다음 이름이 "*ar"인지 확인하세요(이 부분은 현재 작동하지 않음).
당신이 하고 싶은 일은 다음과 같습니다:
find -name '*ar' -delete
그러면 각 파일과 일치하는 항목을 찾아 '*ar'
조건이 충족되는 경우에만 파일을 삭제합니다.
너무 늦게 알았다면 죄송합니다.