답변:
디렉토리 만 일치하도록 끝에 슬래시를 지정할 수 있습니다.
for d in */ ; do
echo "$d"
done
[[ -L $d ]]
$ d가 기호 링크인지 테스트 할 수 있습니다 .
set -P
. 디렉토리를 변경하는 명령에만 영향을줍니다. sprunge.us/TNac
당신은 테스트 할 수 있습니다 -d
:
for f in *; do
if [ -d "$f" ]; then
# $f is a directory
fi
done
이것은 파일 테스트 연산자 중 하나입니다 .
if [[ -d "$f" && ! -L "$f" ]]
symlinks 제외
if [[ "$f" = "*" ]]; then continue; fi
choroba의 솔루션은 우아하지만 현재 디렉토리 내에 디렉토리가 없으면 예기치 않은 동작을 유발할 수 있습니다. 이 상태에서 for
루프를 건너 뛰지 않고 bash는 다음 d
과 같은 위치에서 루프를 정확히 한 번만 실행합니다 */
.
#!/usr/bin/env bash
for d in */; do
# Will print */ if no directories are available
echo $d
done
이 경우를 방지하기 위해 다음을 사용하는 것이 좋습니다.
#!/usr/bin/env bash
for f in *; do
if [ -d ${f} ]; then
# Will not run if no directories are available
echo $f
fi
done
이 코드는 현재 디렉토리의 모든 파일을 반복 f
하고 디렉토리 인지 확인한 다음 f
조건이 true를 반환하면 에코 합니다. 경우 f
에 동일 */
, echo $f
실행되지 않습니다.
shopt -s nullglob
.
디렉토리 만보 다 더 구체적인 파일을 선택 해야하는 경우 다음을 사용 find
하여 전달하십시오 while read
.
shopt -s dotglob
find * -prune -type d | while IFS= read -r d; do
echo "$d"
done
shopt -u dotglob
숨겨진 디렉토리 (또는 zsh에서 setopt dotglob
/) 를 제외하는 데 사용 합니다 unsetopt dotglob
.
IFS=
$IFS
예를 들어, 다음 중 하나를 포함하는 파일 이름이 분할되는 것을 방지합니다 .'a b'
더 많은 옵션에 대해서는 아래 AsymLabs 답변을 참조하십시오find
편집 :
while 루프 내에서 종료 값을 만들어야하는 경우이 트릭으로 여분의 서브 쉘을 우회 할 수 있습니다.
while IFS= read -r d; do
if [ "$d" == "something" ]; then exit 1; fi
done < <(find * -prune -type d)
순수한 bash를 사용할 수 있지만 find를 사용하는 것이 좋습니다.
find . -maxdepth 1 -type d -exec echo {} \;
(숨겨진 디렉토리를 추가로 찾을 것입니다)
shopt -s dotglob
하는 bash
데 사용할 수 있습니다 . 당신도 포함됩니다 .
. 또한 -maxdepth
표준 옵션이 아닙니다 ( -prune
is).
dotglob
옵션은 흥미롭지 dotglob
만의 사용에만 적용됩니다 *
. find .
은 항상 숨겨진 디렉토리 (및 현재 디렉토리)를 포함합니다
루트 디렉토리를 제외하고 현재 작업 디렉토리에서 보이는 디렉토리와 숨겨진 디렉토리를 모두 찾기 위해 수행됩니다.
디렉토리를 반복하려면 :
find -path './*' -prune -type d
결과에 심볼릭 링크를 포함 시키려면 :
find -L -path './*' -prune -type d
심볼릭 링크를 제외한 각 디렉토리에 대해
find -path './*' -prune -type d -print0 | xargs -0 <cmds>
숨겨진 디렉토리를 제외하려면 :
find -path './[^.]*' -prune -type d
반환 된 값에 대해 여러 명령을 실행하려면 (매우 고안된 예) :
find -path './[^.]*' -prune -type d -print0 | xargs -0 -I '{}' sh -c \
"printf 'first: %-40s' '{}'; printf 'second: %s\n' '{}'"
'sh -c'대신 'bash -c'등을 사용할 수도 있습니다.
... -print0 | xargs -0 ...
정확한 이름이 무엇인지 모르는 경우 사용 하는 것이 좋습니다.
find * | while read file; do ...
숨겨진 디렉토리 (점으로 시작)를 포함한 모든 디렉토리를 한 줄로 반복하고 다음을 사용하여 여러 명령을 반복 할 수 있습니다.
for file in */ .*/ ; do echo "$file is a directory"; done
심볼릭 링크를 제외하려면 다음을 수행하십시오.
for file in *; do
if [[ -d "$file" && ! -L "$file" ]]; then
echo "$file is a directory";
fi;
done
참고 : 목록을 사용하는 */ .*/
bash는 작동뿐만 아니라 폴더를 표시 .
하고 ..
폴더에 숨겨진 파일이없는 경우 zsh을에있는 동안이 보여하지만 오류가 발생하지 않습니다
숨겨진 디렉토리를 포함하고 ../를 제외하는 더 깨끗한 버전은 dotglob 옵션과 함께 제공됩니다.
shopt -s dotglob
for file in */ ; do echo "$file is a directory"; done
(또는 setopt dotglob
zsh에서)
당신은 dotglob을 해제 할 수 있습니다
shopt -u dotglob
목록의 각 디렉토리에 전체 경로가 포함됩니다.
for i in $(find $PWD -maxdepth 1 -type d); do echo $i; done
ls -l | grep ^d
또는:
ll | grep ^d
별명으로 설정할 수 있습니다
ls
를 나열 하는 이 기반 답변과 약간 다른 "디렉토리를 통해서만 루프하고 싶습니다"라는 질문에 대답하지 않는다고 생각합니다 .
ls
: mywiki.wooledge.org/ParsingLs을