bash에서 디렉토리와 하위 디렉토리를 반복합니다.


0

반복하려는 폴더가 들어있는 상위 폴더에서 시작 하여이 줄을 사용해 보았습니다.

for dir in */; do  
    cd $dir  
    for dir2 in */; do  
        cd $dir2  
        ls -d $PWD/*  
        cd ..  
    done  
    cd ..  
done

그러나 그것은 단지 전체 컴퓨터의 전체 내용을 출력하고 루트 폴더로 돌아갑니다 / ~ ...이 동작에 대한 설명이 있습니까?


어디에서 시작 하느냐에 따라 설명하는 동작이 동작과 일치하는 것 같습니다. find적어도 스크립트 파일로 CD에 시도하지 않도록 명령은 당신이 달성하려고하는 내용에 따라 더 좋은 옵션이 될 수 있습니다.
Paul

답변:


4

bash와일드 카드와 일치하지 않는 경우 기본 "globbing"(와일드 카드 일치 / 확장) 동작은 와일드 카드 식 자체를 반환하는 것입니다. 따라서 cd하위 디렉토리가없는 디렉토리에 cd들어가면 문자 그대로 '* /'(문자 그대로 별표가있는 디렉토리)로 들어 가려고 시도하고 실패합니다. 따라서 하나보다 높은 디렉토리를 유지하게됩니다 루프에서이 시점에있을 것이라고 생각했습니다. 당신이 그때 cd .., 당신은 다시 한 디렉토리 더 높아질 것입니다. 결국 파일 시스템의 루트 수준으로 돌아갑니다.

많은 쉘 스크립터 find(1)는 스크립트가 디렉토리 트리를 따라가 길 원할 때 쉘 루프 대신 사용하도록 선택합니다 . 전체 스크립트 스 니펫은 다음과 같습니다.

find . -type d

… 또는 상대 경로가 아닌 절대 경로를 원할 경우 :

find "$PWD" -type d

이것을 위해 쉘 루프를 고수하려면 다음과 같이 시도하십시오.

#!/bin/bash
set -evx
for dir in */; do
    if [ -d "$dir" ]; then
        cd "$dir"
        for dir2 in */; do
            if [ -d "$dir2" ]; then
                cd "$dir2"
                ls -d "$PWD"/*
                cd ..
            fi
        done
        cd ..
    fi
done

if명령문을 사용 하여 각 값을 테스트 dir하고 dir2이들이 실제로 디렉토리인지 확인하고 그렇지 않은 경우 생략합니다.

또한 set -evx스크립트를 처음 작성 / 디버깅 할 때 설정하는 훌륭한 옵션 세트 인 행을 참고하십시오
-e. 첫 번째 오류에서 중지됩니다.
-v실행하기 전에 각 줄을 인쇄합니다. 모든 대체 / 확장이 수행 된 후 실행하기 전에
-x각 행 인쇄 합니다.

와일드 카드 표현식이 일치하지 않을 때 와일드 카드 표현식 자체를 리턴하는 기본 글 로빙 동작이 마음에 들지 않으면 bash(1)매뉴얼 페이지에서 nullgloband 같은 쉘 옵션을 살펴 보는 데 시간을 투자 해보 failglob십시오.


말이 되네요. 감사합니다. 이 코드는 루프 동작을 이해하고 '찾기'사용을 권장합니다.
hirschme
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.