다음 명령
mkdir -p /tmp/test/foo /tmp/test/bar && \
find /tmp/test/ -mindepth 1 -type d \
-exec echo Deleting "{}" \; \
-exec rm -rv "{}" \;
인쇄하고 싶습니다
Deleting /tmp/test/foo
removed directory '/tmp/test/foo'
Deleting /tmp/test/bar
removed directory '/tmp/test/bar'
(첫 번째 -exec
문에 따라) 해당 디렉터리를 삭제합니다(두 번째 -exec
문에 따라). 글쎄, 기술적으로 이것은 정확히 일어나고 있는 일이며 stdout에 인쇄됩니다. 그러나 stderr에는 여전히 2줄이 있습니다.
Deleting /tmp/test/foo
removed directory '/tmp/test/foo'
find: ‘/tmp/test/foo’: No such file or directory
Deleting /tmp/test/bar
removed directory '/tmp/test/bar'
find: ‘/tmp/test/bar’: No such file or directory
-exec
따라서 두 번째 명령문 호출이 두 번 실행된 것 같습니다 rm -rv
.
- 여기서 정확히 무슨 일이 일어나고 있나요?
- 위 명령에서 실제로 기대하는 결과를 어떻게 얻을 수 있습니까?
답변1
긴 이야기 짧게
find
당신은 오류 메시지와 유사한 경고 메시지에 혼란스러워 하고 rm
각 디렉토리에서 rm이 여러 번 호출되고 있다고 생각하지만 그렇지 않습니다. 명령 -depth
에 a를 추가하면 find
경고가 중지되고 예상되는 출력이 제공됩니다.
설명하다
디렉토리 구조가 조금 더 복잡하다면 더 명확해질 것입니다. 당신은 현재
$ tree /tmp/test
/tmp/test
├── bar
└── foo
하지만 당신이 말한다면
/tmp/test
├── bar
└── foo
└── wibble
└── hello.txt
따라서 예제 find 명령이 별로 의미가 없다는 것을 알 수 있습니다. 디렉토리에서 파일이 발견되는 순서는 다음과 같습니다.한정되지 않은, 하지만 foo
먼저 발견된 다음 bar
. 이 명령은 먼저 foo 하위 트리를 삭제하므로 /tmp/test/foo/wibble/hello.txt, /tmp/test/foo/wibble, 그리고 /tmp/test/foo가 삭제됩니다. 그런 다음 foo
방금 삭제한 디렉터리를 처리하려고 시도하여 경고 메시지를 생성하라는 메시지를 표시합니다. 그런 다음 /tmp/test의 다음 작업으로 진행합니다 bar
. 즉, 삭제한 다음 bar
방금 삭제한 디렉터리에 들어가려고 시도하고 경고 메시지를 다시 인쇄합니다.
find 명령에 a를 추가하면 -depth
디렉토리가 처리됩니다.뒤쪽에그들의 하위 디렉토리. 따라서 순서는 /tmp/test/foo/wibble입니다(이렇게 하면 /tmp/test/foo/wibble/hello.txt 및 /tmp/test/foo/wibble이 삭제됨). 그런 다음 /tmp/test/foo(이렇게 하면 삭제됨) 이제 비어 있는 /tmp/test/foo 디렉토리를 삭제한 다음 /tmp/test/bar를 삭제합니다(이렇게 하면 /tmp/test/bar 디렉토리가 삭제됩니다).