Bash에서 디렉토리만 반복하는 방법은 무엇입니까?

Bash에서 디렉토리만 반복하는 방법은 무엇입니까?

일부 디렉터리와 일부 파일(일부는 숨겨져 있고 점으로 시작함)이 포함된 폴더가 있습니다.

for d in *; do
 echo $d
done

모든 파일과 디렉토리를 반복하지만 저는 디렉토리만 반복하고 싶습니다. 어떻게 해야 하나요?

답변1

디렉터리에만 일치하도록 후행 슬래시를 지정할 수 있습니다.

for d in */ ; do
    echo "$d"
done

심볼릭 링크를 제외하려면 continue루프를 사용하여 현재 항목이 링크인지 테스트하세요. -L심볼릭 링크로 인식 하려면 이름에서 후행 슬래시를 제거해야 합니다 .

for d in */ ; do
    [ -L "${d%/}" ] && continue
    echo "$d"
done

답변2

다음을 사용하여 이를 테스트할 수 있습니다 -d.

for f in *; do
    if [ -d "$f" ]; then
        # $f is a directory
    fi
done

이게 그 중 하나야파일 테스트 연산자.

답변3

choroba의 솔루션은 훌륭하기는 하지만 현재 디렉터리에 사용 가능한 디렉터리가 없으면 예기치 않은 동작이 발생할 수 있습니다. 이 상태에서 bash는 for루프를 건너뛰지 않고 한 번만 실행합니다. 여기서는 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"

답변4

순수 bash를 사용하여 이를 달성할 수 있지만 find를 사용하는 것이 더 좋습니다.

find . -maxdepth 1 -type d -exec echo {} \;

(추가로 검색에는 숨겨진 디렉터리도 포함됩니다)

관련 정보