숨겨진 디렉터리 및 하위 디렉터리(또는 숨겨진 디렉터리 및 하위 디렉터리에 속하는)를 제외하고 현재 폴더에서 모든 디렉터리 및 하위 디렉터리를 찾고 싶습니다. 다음은 작동하지 않습니다:
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입니다.
숨겨진 항목은 기본적으로 제외되므로 다음을 수행하면 됩니다.
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