Ordnerdurchlauf for-Schleife & find MIT Leerzeichen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von ruediger, 08.06.2010.

  1. #1 ruediger, 08.06.2010
    ruediger

    ruediger Grünschnabel

    Dabei seit:
    08.06.2010
    Beiträge:
    4
    Zustimmungen:
    0
    Hallo alle zusammen :),
    ich bin ein Neuling in Sachen shellscriping und schreibe zur Zeit an einem kleinen Script und hänge seit Tagen etwas in der Luft :( .. Das Script soll einen bestimmten Ordner ($suchpfad) durchlaufen und deren Dateien und Pfade ausgeben. Leider nimmt das Script keine Ordner und Dateien die ein Leerzeichen beinhalten!
    Das Problem liegt offensichtlich in der for-Schleife, die die Leerzeichen in Ordnern und Dateien falsch interpretiert, die mein Verzeichnis durchläuft. :think:

    Die for-Schleife sieht wie folgt aus:
    Wie kann ich der for-Schleife sagen, dass Dateien & Ordner richtig an "i" geliefert werden?
    Ich hoffe ihr könnt mir helfen :hilfe2:

    Gruß Rüdiger
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. foexle

    foexle Kaiser

    Dabei seit:
    02.05.2007
    Beiträge:
    1.104
    Zustimmungen:
    0
    Ort:
    Saarbrücken
    Hi und willkommen im Board,

    ich würde das eher so machen
    Code:
    find $suchpfad -name $name -type f -exec ... 
    
    Also das mit den Leerzeichen mag ich mal bezweifeln da * einfach ein Wildcart ist ....
    Werden überhaupt dateien ausgegeben ? Wenn nein stimmt dein Pfad nicht.

    Versuch dann mal /meinPfad/*

    Greetz
     
  4. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.054
    Zustimmungen:
    8
    Variablen am besten in Anführungszeichen einfügen - als test "$i" - und evtl. noch mit IFS arbeiten.
     
  5. #4 floyd62, 09.06.2010
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Hi,

    also zunächst mal fehlt in der Schleife zum "if" das passende "then"; nehme an/hoffe, das ist nur eine Kleinigkeit, die beim Abtippen passiert ist ...

    Des weiteren führt die Schreibweise
    Code:
    for i in $(find $suchpfad -name "*"); do
    ...
    
    dazu, dass der find-Befehl erst einmal durchläuft, und das Ergebnis davon als Ganzes in die for-Schleife substituiert wird. Spätestens jetzt hat die Shell keine Chance mehr, zu unterscheiden, ob Leerzeichen, Newlines, Tabs etc. (also der Inhalt von $IFS) als Trenner zwischen den Dateinamen oder innerhalb derselben auftreten. Du läufts also einfach mit deiner Variablen $i durch die Worte in dem Suchergebnis, und wenn drei aufeinanderfolgende eigentlich ein Dateiname sind, wen juckt das noch ...

    Ein möglicher Ansatz wäre etwa, mit "while read ..." statt mit "for ..." zu arbeiten:
    Code:
    find "$suchpfad" -name "*" |
    while read i; do
            if test -f "$i"; then 
                    echo "$i ist eine Datei"
            fi
    done
    
    Das sollte auch speichereffizienter sein, weil die beiden Prozesse ("while ..." und "find") parallell arbeiten können, und nicht erst das Gesamtergebnis von "find" zwischengespeichert werden muss.

    Und, wie marce schon anmerkt, Quotes um die Variablen (auch um "$suchpfad") stellen sicher, dass die Shell die Dinger nicht an den Leerzeichen aufteilt und die Komponenten dann separat weiterverwurstet.

    (NB: die Option '-name "*"' kannst du auch gleich weglassen; der '*' matcht schliesslich immer.)

    Wenn es wirklich nur darum geht, die regulären Dateien unterhalb von "$suchpfad" aufzulisten, ist natürlich der von foexle vorgeschlagene Weg ("find .... -type f") wesentlich besser: warum sollte man ein zusätzliches Kommando ("test") bemühen, wenn "find" das Ausfiltern sowieso mit erledigen kann.

    Als Ergänzung dazu kannst du evtl. - zumindest wenn du GNU Tools verwendest - einmal "find ... -print0 ..." und "xargs -0 ..." abchecken. Damit wird als Trenner zwischen den Dateinamen ein Null-Byte verwendet, das definitiv nicht innerhalb der Namen auftreten sollte. Wenn du auf die Files aus "find ..." nur jeweils ein bestimmtes Kommando ausführen willst, ist das oft eine einfacher Weg.

    Gruss,
    A.
     
  6. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.054
    Zustimmungen:
    8
    noch einfacher wäre dann, einfach -exec von find zu benutzen - da spart man sich dann sämtliche Pipes, Schleifen und andere "kruden" Dinge drumrum...
     
  7. #6 ruediger, 09.06.2010
    ruediger

    ruediger Grünschnabel

    Dabei seit:
    08.06.2010
    Beiträge:
    4
    Zustimmungen:
    0
    danke danke :) auch nochmals allen ein fröhliches Hallo
    und bereits ein herzliches Dankeschön für die vielen Antworten und Hilfestellungen

    ja das hatte soweit alles gepasst, nur das Ordner bzw. Dateien wie beispielsweise
    Order "abc d" wurde als $i=abc und $i=d ausgegeben

    richtig :) ich habe es beim abtippen einfach übersehen :)

    vielen Dank mit der speichereffizienteren (war mir noch nicht bekannt) Variante "while" und "find" und "$i" klappt es nun wunderbar :D und die Leerzeichen werden nun auch richtig übernommen, ich denke es hat wirklich an den "" gelegen :)

    vielen Dank an Alle, ihr seit klasse!

    Gruß an alle
     
  8. #7 ruediger, 28.06.2010
    Zuletzt bearbeitet: 28.06.2010
    ruediger

    ruediger Grünschnabel

    Dabei seit:
    08.06.2010
    Beiträge:
    4
    Zustimmungen:
    0
    cron + variablen ?!?

    Hallo alle zusammen,
    ich hoffe ihr könnt mir nocheinmal weiterhelfen. :hilfe2:

    Das Backupscript steht jetzt soweit und es funktioniert auch alles 1A :)) (wenn ich es selbst starte)
    nun möchte ich es mittels cronjob 1x täglich anstoßen..
    Leider klappt dies nicht :( der cron stößt es korrekt an aber leider geht dann nicht viel mehr (kein durchlauf der Ordnerstruktur usw.)
    ich vermute, dass der cron die Variablen nicht ordentlich aus dem script nimmt. Gibt es da einen Trick?!? :think:

    Bis jetzt habe ich dem cron die bash als Shell zugewiesen und den richtoigen Benutzer eingetragen. Im Script selbst, habe ich mit export die Variablen versehen..

    wär klasse wenn jemand eine Idee hätte

    Gruß ruediger
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.054
    Zustimmungen:
    8
    absolute Pfade verwenden und sonstige notwendige ENVs setzen, cd am Scriptanfang in richtiges Basisverzeichnis, ...
     
  11. #9 ruediger, 28.06.2010
    ruediger

    ruediger Grünschnabel

    Dabei seit:
    08.06.2010
    Beiträge:
    4
    Zustimmungen:
    0
    ahhh danke, es hat an den absoluten pfaden gehangen :)

    Gruß
     
Thema: Ordnerdurchlauf for-Schleife & find MIT Leerzeichen
Besucher kamen mit folgenden Suchen
  1. for i schleife unterverzeichnis

Die Seite wird geladen...

Ordnerdurchlauf for-Schleife & find MIT Leerzeichen - Ähnliche Themen

  1. for-Schleife vorzeitig beenden

    for-Schleife vorzeitig beenden: Hallo, ich habe mir ein Skript geschrieben das mir den Audiostream einer Video-DVD in wav-Dateien kapitelweise speichert. Das extrahieren des...
  2. Max_Args trotz for-Schleife überschritten...

    Max_Args trotz for-Schleife überschritten...: Hallo Leute, ich habe ein kleines Problem mit einem Script von mir. Ich habe das unten gezeigte Script geschrieben um sehr viele Dateien von...
  3. Ungerade Dateien Filtern / For-Schleife

    Ungerade Dateien Filtern / For-Schleife: Hallo Jungs, ich hoffe ihr könnt mir weiterhelfen. Hier die Aufgabe: In das Verzeichnis "/pfad/zu/den/dateien" wechseln. Dort stehen 20...
  4. Java: geschachtelte For-Schleife oder Logikproblem

    Java: geschachtelte For-Schleife oder Logikproblem: Hi, Ich grüble gerade über ein Problem bei dem ich einfach nicht dahinterkomme. Der Code ist ein Ausschnitt aus meinem TicTacToe-Programm....
  5. for-Schleife

    for-Schleife: Hi, ich hab mal ne ganz dumme Frage... ;) Ich hab ein Programm, dass mit einem Parameter ausgeführt werden soll. Da ich die ganzen Parameter...