ls inklusive Pfadangaben

L

lapisa

Grünschnabel
Hallo!

Ich schreibe gerade ein Script in dem ich alle Dateien eines Verzeichnisbaums als Eingabe, inklusive des Pfades benötige. Da ls dies meines Wissens nach nicht unterstützt, habe ich folgendes script für die Kommandozeile geschrieben:

Code:
Counter=0;
ddir="*/";
dddir="*/";
while [ $Counter -lt 2 ];
 do for i in $(ls -d $ddir);
  do for j in $(ls $i*);
   do echo $i$j;
  done;
 done;
 echo $Counter $ddir;
 let Counter=Counter+1;
 ddir=$ddir$dddir;
done;

Problem ist, dass jedes Wort einer Datei mit Leerzeichen als einzelne Datei gesehen wird.
Also würde dir Datei "neue Datei.txt" im Verzeichnis "/Verzeichnis/" als

Code:
/Verzeichnis/neue
/Verzeichnis/Datei.txt

erkannt werden.
Nicht so toll, weiß jemand was man ändern muss?
Danke Martin
 
Hallo

Über das Problem mit hässlichen Zeichen in Dateinamen (inclusive Leerzeichen) wurde hier schon oft diskutiert.
Mein Tipp dazu ist wie immer:
1) Immer quoting der Variablen verwenden
2) find mit -print0 und xargs verwenden

Code:
find ./ -maxdepth 1 -type f -print0|xargs -0 -n1
liefert dir alle Dateien im aktuellen Pfad (hier ohne Unterverzeichnisse) als NULL-terminierte Argumente, welche xargs weiterreicht. Mit -0 -n1 wird jedes Argument einzeln behandelt.

Siehe
man find man xargs

Gruß Wolfgang
 
Hallo Wolfgang,

danke für die Antwort. Dein Code funktioniert wenn ich ihn so verwende.
Ich möchte die Ausgabe jedoch weiter verarbeiten und versuche mittels
Code:
for i in $( find ./ -maxdepth 2 -type f -print0|xargs -0 -n1 ); do echo $i; done;

nun auf jede Datei zuzugreifen. Leider liefert echo $i immer noch die getrennten Dateinamen.

Gruß
Martin
 
Hallo
Ja, damit setzt du das ganze wieder außer Kraft.
Verwende statt dessen einfach eine pipe auf while read...
Lass die ganz for i in Schleife weg un pipe das direkt in ein while read.
Sieh dir auch mal das read in der manpage an.
Ich denke damit kommst du klar.

Gruß Wolfgang
 
Pipes sind SEHR nützlich. Ich muss mich damit mal ein wenig auseinandersetzen.
Danke Wolfgang.

Gruß
Martin
 
Und wenn du nicht gerade Steuerzeichen in deinen dateinamen hast, dann geht das auch ohne -print0

Code:
find /path -type f |while read dateiname;
do
echo "$dateiname"
done
Das funktioniert auch mit Leerzeichen.
read verteilt den gesamten String am IFS geteilt auf die Variablen.
Sind mehr Argumente als Variablen vorhanden, wird der Rest in die letzte Variable gepackt.
Da du hier nur eine Variable hast, landet alles darin.
Bei der Verarbeitung musst du nun auf das Quoting achten.


Gruß Wolfgang
 

Ähnliche Themen

Switche abfragen über Script

Skript soll nicht doppelt laufen... kill pkill pid cron

Verschlüsseltes Backup-Script mit rsync

Shell Skript beschleunigen

Summe von Zahlen in einer Zeilen bilden

Zurück
Oben