
Tengo el siguiente código de un script a continuación que se supone captura la salida de ls -l
su 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 ls
no es aconsejable, incluso cuando se utiliza una implementación que admita opciones para una salida inequívoca, como -b
o -Q
en 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[@]}