공백이 포함된 파일 이름이 올바르게 나열되지 않습니다.

공백이 포함된 파일 이름이 올바르게 나열되지 않습니다.

아래 스크립트에는 ls -l현재 디렉터리의 출력을 캡처하고 총계가 기록되는 첫 번째 줄을 삭제하는 다음 코드가 있습니다. 그런 다음 모든 파일에 대한 권한, 소유자 및 파일 이름과 마지막에 총 줄 수를 터미널에 출력합니다. 문제는 디렉토리에 이름에 공백이 포함된 파일이 올바르게 나열되지 않은 경우입니다. 왜 안 돼?

list=`ls -l`

IFS_old=$IFS
IFS=$'\n'
i=0
for row in $list
do
    if (( $i == 0 )); then 
        ((i++))
    else
        IFS=$' '
        j=0
        for attrib in $row
        do
            ((j+=1))
            if (( $j == 1 )) || (( $j == 3 )) || (( $j == 5 )) || (( $j == 9 )); then 
                printf "%s " $attrib
            fi
        done
        printf "\n"
        IFS=$'\n'
        ((i++))
    fi
done
printf "%s%s\n" "Total number of files : " $((i-1)) 
IFS=$IFS_old
exit 0

답변1

GNU 버전과 같이 명확한 출력에 대한 옵션을 지원하는 구현을 사용하는 경우에도 의 출력을 구문 분석하는 ls것은 좋지 않습니다 .-b-Q

대신, 쉘 글로브를 사용하여 한 번에 하나씩 파일을 처리해야 합니다. Bash에서는 이를 위해 배열을 사용할 수 있습니다.

#!/bin/bash

files=(*)

for i in "${files[@]}"
do
    stat --format '%A %U %n' -- "$i"
done

printf "Total number of files: %d\n" ${#files[@]}

관련 정보