
У меня есть следующий код из скрипта ниже, который должен захватывать вывод ls -l
в вашем текущем каталоге и отбрасывать первую строку, где написано total. Затем выводить на терминал для каждого файла разрешение, владельца и имя файла, а в конце общее количество строк. Проблема в том, что если в каталоге есть файл, содержащий пробел в имени, он не отображается правильно. Почему?
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
Попытка проанализировать вывод ls
нецелесообразна, даже при использовании реализации, поддерживающей параметры однозначного вывода, например -b
или -Q
в версии GNU.
Вместо этого следует использовать shell glob для обработки файлов по одному; в Bash для этого можно использовать массив:
#!/bin/bash
files=(*)
for i in "${files[@]}"
do
stat --format '%A %U %n' -- "$i"
done
printf "Total number of files: %d\n" ${#files[@]}