Bash 스크립트: 현재 디렉터리 대신 하위 디렉터리를 구문 분석합니다.

Bash 스크립트: 현재 디렉터리 대신 하위 디렉터리를 구문 분석합니다.

하위 디렉터리 이름을 구문 분석하려고 하는데 출력 결과에서 이름이 개별 단어로 구분됩니다.

예를 들어. 하위 디렉터리 이름이 "Hello World"인 경우 출력은 다음과 같습니다.

.  
Hello  
World  

다음 코드는 작동하지만 출력에는 원하지 않는 현재 디렉터리가 포함됩니다.

find "$my_dir" -maxdepth 1 -type d -print0 |
    while IFS= read -rd '' dir;
        do 
            echo "$dir"; 
        done

출력에서 현재 디렉터리를 제거하는 if 문을 포함하려고 했지만 코드에는 여전히 각 하위 디렉터리 이름에 대해 별도의 단어가 표시되는 것 같습니다.

find "$my_dir" -maxdepth 1 -type d -print0 |  
    while IFS= read -rd '' dir;
        do 
            if ["$dir" != "."]; then
                echo "$dir"
            fi
        done

답변1

공백으로 인한 중단은 read명령에서 발생하지만 어쨌든 그렇게 할 필요는 없습니다. 또한 논리에 문제가 있습니다 if. my_dir같음 인 경우에만 작동하고 ., 그렇지 않으면 출력에 a 를 생성 find하지 않습니다 . .마지막으로, 예제에서는 전체 경로가 아닌 디렉토리 이름만 원한다고 명시하고 작성한 방식대로 find경로가 표준 출력으로 전달됩니다.

더 간단한 해결책은 다음과 같습니다.

find "$my_dir" -maxdepth 1 -type d -exec basename {} \;|tail -n +2

여기서 비결은 tail명령입니다. $my_dir출력에서 시작 디렉터리( )를 제외 하려고 합니다 . find이 디렉터리는 항상 먼저 출력되므로(깊이 우선 순회를 명시적으로 요청하지 않는 한) 결과 출력에서 ​​첫 번째 줄만 제거하면 됩니다.

답변2

그렇다면 -mindepth여기에서 트리의 최상위 디렉터리를 제외하는 데 사용할 수 있는 이 옵션을 사용하세요.

find "$my_dir" -mindepth 1 -maxdepth 1 -type d -print0

-maxdepth그러나 깊이 도 제한하고 있으므로 for루프를 사용하는 것은 어떻습니까?

for dir in "$my_dir"/*
do
    [[ -d "$dir" ]] || continue    # only directories
    echo "${dir/*\/}"              # just basename
done

관련 정보