숨겨진 디렉터리를 제외한 모든 디렉터리 찾기

숨겨진 디렉터리를 제외한 모든 디렉터리 찾기

숨겨진 디렉터리 및 하위 디렉터리(또는 숨겨진 디렉터리 및 하위 디렉터리에 속하는)를 제외하고 현재 폴더에서 모든 디렉터리 및 하위 디렉터리를 찾고 싶습니다. 다음은 작동하지 않습니다:

find . -type d -name "[!.]*"

비어 있는 숨겨진 폴더만 피할 수 있다고 생각했기 때문입니다. 뭔가 이런게 어울리겠다

./.cache/totem

답변1

점으로 시작하는 디렉토리를 "숨김"으로 분류한다고 가정합니다. 그러한 디렉토리를 입력하지 않으려면 를 사용해야 합니다 -prune.

find . -mindepth 1 -type d \( -name '.*' -prune -o -print \)

이는 현재 디렉터리에서 시작됩니다( *여기서 지정할 수 있지만 와일드카드가 도트 파일/디렉터리를 포함하도록 설정되지 않은 경우에만 - 예: bash's dotglob). 그런 다음 디렉토리에만 일치하고 .자체에는 일치하지 않습니다. 괄호 안의 부분은 find이름이 일치하면 .*해당 항목이나 해당 하위 항목이 더 이상 고려되지 않도록 잘라내어 이름이 인쇄된다는 것을 알려줍니다.

(비 POSIX) 옵션이 없으면 -mindepth이 대안을 사용할 수 있습니다. 틀림없이 이것은 내가 제안한 원래 솔루션보다 낫지만 답변에 두 가지를 모두 남겨 두겠습니다.

find . -type d \( -name '.?*' -prune -o -print \)

답변2

그리고 zsh:

print -rC1 -- **/*(N/)

(zsh globs는 기본적으로 숨겨진 파일을 건너뜁니다.)

또는 다음 디렉터리로 무엇이든 할 수 있습니다.

for dir (**/*(N/)) anything with $dir

또는 anything한 번에 여러 파일을 얻을 수 있는 경우 GNU xargs또는 호환 버전을 사용하세요.

xargs -r0a <(print -rNC1 -- **/*(N/)) anything with

POSIX적으로:

LC_ALL=C find . -name '.?*' -prune -o -type d -print

LC_ALL=C그렇지 않으면 이름에 사용자 로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스가 ​​포함된 숨겨진 디렉터리를 건너뛰는 데 실패합니다. 또한 술어의 순서가 로 끝나는 -type d이름의 쌍을 방지하는 방법을 확인하세요 .lstat().

이 명령은 .(현재 작업 디렉터리)도 출력합니다. 필요하지 않은 경우 ! -name .앞에 하나를 추가하거나 다음과 같이 변경하세요.-type

LC_ALL=C find . ! -name . \( -name '.*' -prune -o -type d -print \)

파일에 대한 작업을 수행하고 한 번에 여러 파일을 가져오려면 또는 로 -print바꾸 십시오.-exec anything with {} ';'-exec anything with {} +anything

답변3

또 다른 옵션은 오픈 소스 도구 Fd입니다.

https://github.com/sharkdp/fd

숨겨진 항목은 기본적으로 제외되므로 다음을 수행하면 됩니다.

fd -t d

항목 숨기기를 취소하려면 다음 중 하나 또는 둘 다를 사용할 수 있습니다.

-H, --hidden            Search hidden files and directories
-I, --no-ignore         Do not respect .(git|fd)ignore files

답변4

그냥 사용:

find . ! -path '*/.*' -type d

관련 정보