
Eu tenho o seguinte código de um script abaixo que deve capturar a saída do ls -l
seu diretório atual e descartar a primeira linha, onde total está escrito. Em seguida, envie para o 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 é que se no diretório houver um arquivo contendo espaços em branco no nome, ele não estará listado corretamente. Por que 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
Responder1
Tentar analisar a saída de ls
é desaconselhável, mesmo quando se usa uma implementação que suporta opções para saída inequívoca, como -b
ou -Q
na versão GNU.
Em vez disso, você deve usar um shell glob para processar um arquivo de cada vez; no Bash, podemos usar um array 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[@]}