"type d"찾기에서 this / current / dot 폴더를 제외하는 방법


186
find . -type d

시작점 아래의 모든 디렉토리를 찾는 데 사용할 수 있습니다. 그러나 현재 디렉토리 ( .)도 반환 하므로 원하지 않을 수 있습니다. 어떻게 제외 할 수 있습니까?

답변:


194

POSIX 7 솔루션 :

find . ! -path . -type d

이 경우 ( .)의 경우 골프보다 mindepth솔루션 (24 vs 26 자) 보다 낫습니다 !.

다른 디렉토리를 제외하려면 골프의 성능이 떨어지고 DRYness에 대한 변수가 필요합니다.

D="long_name"
find "$D" ! -path "$D" -type d

!와 사이의 의사 결정 트리 -mindepth:

  • 스크립트? !휴대 성을 위해 사용하십시오 .
  • GNU 대화식 세션?
    • 제외 .? 동전을 던져.
    • 제외 long_name? 사용하십시오 -mindepth.

여러 경로를 제외 해야하는 경우 find /path/ ! -path "/path/first" ! -path "/path/second"이것이 유일한 방법입니까?
빈센트 드 스멧

2
@VincentDeSmet 당신은 그 경로들만 배제하고 싶습니까? 경로 만 있으면 find / ! -regex '/\(a\|b\)/.*'grep을 통해 파이프를 사용 하거나 더 간단하게 사용할 수 있습니다 . 하지 같이 Recurse에, 위의 매우 비효율적 당신은 사용해야합니다 -prune: stackoverflow.com/questions/1489277/...
치로 틸리郝海东冠状病六四事件法轮功

내 문제는 다음과 같습니다. 하위 디렉토리 1 개를 제외하고 디렉토리 내의 모든 것을 재귀 적으로 삭제하고 싶었습니다. 디렉토리를 제외하기 위해 findwith grep를 사용 했지만 상위 디렉토리가 여전히 존재하여 모든 것이 삭제되었습니다.
Vincent De Smet

내가 직접 솔루션을 함께 볼 수 없습니다 @VincentDeSmet find, 당신은 접두사를 확인해야 할 것 : stackoverflow.com/questions/17959317/... 그러나 그것을 처리 할 수있는 for 루프 배쉬를 :-)
치로 틸리郝海东冠状病六四事件法轮功

느낌표 문자 ( \!) 를 벗어나 면 안전합니다. 내 머신의 모든 예제가 man find빠져 나갔으므로 아마도 Good Idea ™ 인 것 같습니다. 편집 — 방금 명시 적으로 다음과 같이 말했습니다.! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Adrian Günter

201

파라미터에 find의해 재귀 깊이를 제어 할 수있을 뿐만 아니라, 해당 -maxdepth파라미터를 사용하여 깊이를 "상단"으로 제한 할 수도 있습니다 -mindepth. 따라서 실제로 필요한 것은 다음과 같습니다.

find . -mindepth 1 -type d

5
GNU find에서 작동하지만 불행히도 POSIX 7 find 의 gnu 확장 이며 LSB조차도 POSIX 쉘 유틸리티 (GNU 확장 유틸리티가 아닌)를 사용합니다
Ciro Santilli 郝海东 冠状 病 六四 事件 法 unJun

6
이것은 나를 위해 일했습니다. 즉 :find . -mindepth 1 -maxdepth 1 -type d ...
racl101

19

find ./* <...>첫 번째 수준의 도트 파일을 무시하지 않아도되는 경우 사용 합니다 ( *글로브는 기본적으로 bash에서 이것과 일치하지 않습니다-shopt 내장의 'dotglob'옵션 참조 : https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).

이클립스 tmp # find.
.
./화면
./screen/.testfile2
./.X11-unix
./.ICE-unix
./tmux-0
./tmux-0/ 기본
이클립스 tmp # find ./*
./화면
./screen/.testfile2
./tmux-0
./tmux-0/ 기본

참고로 이 트릭을 -exec옵션 과 함께 사용하지 마십시오 . 예를 들어을 시도 find dir/* -type d -exec rmdir {} \;하면 오류가 표시됩니다.
plhn

당신은 착각하거나 어쩌면 잘못 조언을 받았습니다. 그 명령은 잘 작동합니다. 오류가 발생하면 오류가 발생 rmdir하고 디렉토리가 비어 있지 않다는 것을 알리고있을 가능성이 높습니다. 디렉토리를 find깊이 우선 검색하여 부모보다 먼저 자식을 표시하기 때문입니다.
Milos Ivanovic

2
참고 : "첫 번째 수준의 도트 파일 무시"는 모든 숨겨진 파일 / 디렉토리를 제외하는 것을 의미합니다.
Jonathan H

2

글쎄, 간단한 해결 방법도 있습니다 (솔루션은 Windows git bash에서 작동하지 않았습니다)

find * -type d

성능이 좋지는 않지만 일을 끝내고 때로는 필요한 일입니다.

[편집] : @AlexanderMills가 언급했듯이 루트 위치에 ./.hidden숨겨진 디렉토리는 표시되지 않지만 숨겨진 하위 디렉토리 (예 :)는 표시됩니다 ./folder/.hiddenSub. [Windows에서 git bash로 테스트]

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