Dateinamen mit Leerzeichen werden nicht korrekt aufgelistet

Dateinamen mit Leerzeichen werden nicht korrekt aufgelistet

Ich habe den folgenden Code aus einem Skript weiter unten, der die Ausgabe in Ihrem aktuellen Verzeichnis erfassen ls -lund die erste Zeile, in der „total“ steht, verwerfen soll. Anschließend wird für jede Datei die Berechtigung, der Eigentümer und der Dateiname sowie am Ende die Gesamtzahl der Zeilen an das Terminal ausgegeben. Das Problem besteht darin, dass eine Datei, deren Name Leerzeichen enthält, nicht korrekt aufgelistet wird. Warum nicht?

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

Antwort1

lsEs ist nicht ratsam, zu versuchen, die Ausgabe von zu analysieren , selbst wenn Sie eine Implementierung verwenden, die Optionen für eindeutige Ausgaben unterstützt, wie beispielsweise -boder -Qin der GNU-Version.

Stattdessen sollten Sie einen Shell-Glob verwenden, um Dateien einzeln zu verarbeiten. In Bash können wir hierfür ein Array verwenden:

#!/bin/bash

files=(*)

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

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

verwandte Informationen