
Ich habe den folgenden Code aus einem Skript weiter unten, der die Ausgabe in Ihrem aktuellen Verzeichnis erfassen ls -l
und 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
ls
Es 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 -b
oder -Q
in 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[@]}