아래 스크립트에는 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[@]}