답변:
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십시오.
find적어도 스크립트 파일로 CD에 시도하지 않도록 명령은 당신이 달성하려고하는 내용에 따라 더 좋은 옵션이 될 수 있습니다.