Los nombres de archivos que contienen espacios en blanco no aparecen correctamente

Los nombres de archivos que contienen espacios en blanco no aparecen correctamente

Tengo el siguiente código de un script a continuación que se supone captura la salida de ls -lsu directorio actual y descarta la primera línea, donde está escrito el total. Luego envíe al terminal para cada archivo el permiso, el propietario y el nombre del archivo y al final el número total de líneas. El problema es que si en el directorio hay un archivo que contiene espacios en blanco en el nombre, no aparece correctamente. ¿Por qué no?

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

Respuesta1

Intentar analizar la salida de lsno es aconsejable, incluso cuando se utiliza una implementación que admita opciones para una salida inequívoca, como -bo -Qen la versión GNU.

En su lugar, debería utilizar un shell global para procesar archivos uno a la vez; En Bash, podemos usar una matriz para esto:

#!/bin/bash

files=(*)

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

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

información relacionada