find . -type d
시작점 아래의 모든 디렉토리를 찾는 데 사용할 수 있습니다. 그러나 현재 디렉토리 ( .
)도 반환 하므로 원하지 않을 수 있습니다. 어떻게 제외 할 수 있습니까?
find . -type d
시작점 아래의 모든 디렉토리를 찾는 데 사용할 수 있습니다. 그러나 현재 디렉토리 ( .
)도 반환 하므로 원하지 않을 수 있습니다. 어떻게 제외 할 수 있습니까?
답변:
find . ! -path . -type d
이 경우 ( .
)의 경우 골프보다 mindepth
솔루션 (24 vs 26 자) 보다 낫습니다 !
.
다른 디렉토리를 제외하려면 골프의 성능이 떨어지고 DRYness에 대한 변수가 필요합니다.
D="long_name"
find "$D" ! -path "$D" -type d
!
와 사이의 의사 결정 트리 -mindepth
:
!
휴대 성을 위해 사용하십시오 ..
? 동전을 던져.long_name
? 사용하십시오 -mindepth
.find / ! -regex '/\(a\|b\)/.*'
grep을 통해 파이프를 사용 하거나 더 간단하게 사용할 수 있습니다 . 하지 같이 Recurse에, 위의 매우 비효율적 당신은 사용해야합니다 -prune
: stackoverflow.com/questions/1489277/...
find
with grep
를 사용 했지만 상위 디렉토리가 여전히 존재하여 모든 것이 삭제되었습니다.
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.
파라미터에 find
의해 재귀 깊이를 제어 할 수있을 뿐만 아니라, 해당 -maxdepth
파라미터를 사용하여 깊이를 "상단"으로 제한 할 수도 있습니다 -mindepth
. 따라서 실제로 필요한 것은 다음과 같습니다.
find . -mindepth 1 -type d
find . -mindepth 1 -maxdepth 1 -type d ...
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 {} \;
하면 오류가 표시됩니다.
rmdir
하고 디렉토리가 비어 있지 않다는 것을 알리고있을 가능성이 높습니다. 디렉토리를 find
깊이 우선 검색하여 부모보다 먼저 자식을 표시하기 때문입니다.
find /path/ ! -path "/path/first" ! -path "/path/second"
이것이 유일한 방법입니까?