Hallo zusammen,
ich möchte eine rekursive Liste aller Dateinamen in einem Verzeichnis und in allen Unterverzeichnissen erstellen. Hierbei sollen versteckte "Punkt-Dateien" berücksichtigt werden, Verzeichnisnamen allerdings nicht. Ebenso möchte ich zu einem späteren Zeitpunkt die Dateigrößen mit ausgeben (deshalb ls -l, siehe unten).
Mein Skript sieht momentan folgendermaßen aus:
#!/bin/bash iterate() { line=$1 if [ ${line:0:1} == \. ] then actual_directory=$(echo "$line" | sed 's/\./\/home\/user/; s/\(.*\):/\1/') else line=$(echo $line | awk '{$1=$2=$3=$4=$5=""; print $0}') echo $actual_directory/$line fi } ls -laRgG | grep '^[^d]' | grep '^[^insgesamt]' | while read a; do iterate "$a"; done
Ausgeführt in meinem Home-Verzeichnis ergibt dies folgende Ausgabe (Auszug):
/home/user/ .bash_history /home/user/ .bash_logout /home/user/ .bashrc /home/user/ datei mit vier leerzeichen am anfang.txt /home/user/ Eine Datei mit langem Namen und vielen Leerzeichen.txt /home/user/ .profile /home/user/.cache/ motd.legal-displayed /home/user/.mc/ filepos /home/user/.mc/ history
Fast perfekt, es ergibt sich nur ein Problem: Das "Leerzeichen", das keins ist (die "datei mit vier leerzeichen am anfang.txt" hat z.B. tatsächlich vier Leerzeichen am Anfang) - sehr schön zu erkennen, wenn man Zeile 10 im Skript folgendermaßen ändert:
line=$(echo $line | awk '{$1=$2=$3=$4=$5=""; print $0}' | sed 's/\ /[L]/' )
resultiert in (Auszug):
/home/user/[L] datei mit vier leerzeichen am anfang.txt /home/user/[L] Eine Datei mit langem Namen und vielen Leerzeichen.txt
Hänge ich dem sed noch ein "g" an, sieht das folgendermaßen aus:
/home/user/[L][L][L][L][L]datei[L]mit[L]vier[L]leerzeichen[L]am[L]anfang.txt /home/user/[L][L][L][L][L]Eine[L]Datei[L]mit[L]langem[L]Namen[L]und[L]vielen[L]Leerzeichen.txt
Irgendetwas passt hier nicht... Vor jeder Dateinamen stehen grundsätzlich fünf Leerzeichen, eventuelle Leerzeichen am Anfang eines Dateinamens werden ignoriert.
ls nutzt hier offenbar irgendwelche mir unbekannte Steuerzeichen zur Formatierung der Ausgabe - Tabs (\t) sind es offensichtlich nicht, zumindest springt ein
sed 's/\t/[T]/g'
nicht darauf an.
Wie ist die Ausgabe von ls formatiert? Wie separiere ich die Felder sauber und bekomme die "Trenner" weg?
Gruß
Christian