저는 디렉터리 경로 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
됩니다. , 치명적인 오류가 발생합니다).bash
zsh
zsh
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()
허가가 거부되었습니다