하위 폴더를 나열하는 스크립트를 실행한 후 빈 디렉터리에 대해 별표가 인쇄됩니다.

하위 폴더를 나열하는 스크립트를 실행한 후 빈 디렉터리에 대해 별표가 인쇄됩니다.

저는 디렉터리 경로 d를 인수로 사용하고 d에 있는 모든 파일과 디렉터리의 깊게 들여쓰기된 목록을 반복적으로 인쇄하는 쉘 스크립트를 작성하려고 합니다. 그러나 d 인수는 선택 사항이며 인수가 지정되지 않으면 현재 디렉터리에 있는 모든 파일과 디렉터리의 들여쓰기된 목록이 인쇄됩니다. 이것은 내 코드입니다.

# the method for tree

myspace=""
spaceCount=0
tree(){     
  cd "$1"
  for i in *; do
    if [ -d "$i" ]; then
      echo -n "|"   
      for (( j=0;j<spaceCount;j++ )) 
      do 
        echo -n "$myspace"  
      done
      echo "--$i"
      spaceCount=$((spaceCount+1)) 
      myspace="  |"
      tree "$i"
    else
      echo -n "|"
      for (( j=0;j<spaceCount;j++ )) 
      do 
        echo -n "$myspace"  
      done
      echo "--$i"
    fi
  done
  cd ../
  spaceCount=$((spaceCount-1))
}


if [ "$1" != "" ]; then
  file="$1"
fi
echo ".$file"
tree "$file"

그러나 폴더가 비어 있으면 다음과 같은 별표가 인쇄됩니다.여기에 이미지 설명을 입력하세요.

이 문제를 어떻게 해결할 수 있나요?

답변1

bash일반적으로 Bourne 스타일 쉘( zsh예외 포함) 에서는 *이와 같이 일치하지 않는 파일의 glob이 자체적으로 확장됩니다. 구문을 사용하는 스크립트는 기본적으로 일치하지 않는 glob에 대해 및 에서도 인식 ksh93됩니다. , 치명적인 오류가 발생합니다).bashzshzsh

echo *파일이 없거나 숨겨진 파일만 있는 디렉토리에서는 *.

for i in *여기서는 for i in *(N)( zsh) 또는 for i in ~(N)*( ksh93)를 대신 사용하거나, 사용하는 경우 bash다음을 설정하십시오.빈 공shopt -s nullglob확장과 일치하지 않는 glob에 대해 아무 작업도 수행되지 않도록 옵션( )을 사용합니다 .

또는 파일이 존재하는지 확인하여 필터링하는 루프 [ -e "$i" ] || continue나 시작 부분에 파일을 추가할 수 있습니다 (읽었지만 검색 권한이 없는 디렉터리의 동작에 영향을 줌).for*

더 많은 내용을 읽으려면 다음을 방문하세요.nullglob이 기본값이 아닌 이유는 무엇입니까?


¹ 이 디렉터리에서는 *숨겨지지 않은 모든 파일로 확장되지만 시스템 호출이 반환되기 [ -e "$i" ]때문에 각 파일에 대해 false를 반환합니다.stat()허가가 거부되었습니다

관련 정보