Os nomes de arquivos contendo espaço em branco não estão listados corretamente

0

Eu tenho o seguinte código de um script abaixo que deveria capturar a saída de ls -l em seu diretório atual e descartar a primeira linha, onde o total é gravado. Em seguida, imprima no terminal para cada arquivo a permissão, o proprietário e o nome do arquivo e, no final, o número total de linhas. O problema é se no diretório houver um arquivo contendo espaço em branco no nome, ele não está listado corretamente. Porque não?

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
    
por Pepka 15.12.2016 / 11:55

1 resposta

2

Tentar analisar a saída de ls é imprudente, mesmo quando se usa uma implementação que suporte opções para saída não ambígua, como -b ou -Q na versão GNU.

Em vez disso, você deve usar um shell glob para processar arquivos um de cada vez; no Bash, podemos usar uma matriz para isso:

#!/bin/bash

files=(*)

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

printf "Total number of files: %d\n" ${#files[@]}
    
por 15.12.2016 / 15:06

Tags