Wie finde ich Leerzeichen im dateinamen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von aloisius, 21.01.2013.

  1. #1 aloisius, 21.01.2013
    aloisius

    aloisius Jungspund

    Dabei seit:
    24.04.2006
    Beiträge:
    16
    Zustimmungen:
    0
    Hallo,

    ich habe ein script mit einer Schleife über alle Dateien in einem Verzeichnis.

    #!/bin/sh
    for i in `ls *`
    do
    echo $i
    done



    Wenn im Verzeichnis Dateien mit Leerzeichen auftauchen z.B. Dateiname = "Datei mit Leerzeichen"
    dann liefert das script 3 Zeilen

    Datei
    mit
    Leerzeichen

    Ich möchte die Leerzeichen durch ein _ ersetzen. Dazu muss ich aber erstmal prüfen ob eine dateiname Leerzeichen enthält.
    Da die Variable $i nie den ganzen Dateinamen mit Leerzeichen enthält kann ich mit $i nicht arbeiten.
    Hat jemand eine Idee wie ich das machen kann?
     
  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. #2 bitmuncher, 21.01.2013
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    find . -type f -name '*\ *' -print
     
  4. #3 aloisius, 21.01.2013
    aloisius

    aloisius Jungspund

    Dabei seit:
    24.04.2006
    Beiträge:
    16
    Zustimmungen:
    0
    Hallo bitmucher,
    wenn ich nur eine Datei habe dann kann ich mit name =`find . -type f -name '*\ *' -print `
    den dateinamen bekommen.
    Wenn ich aber mehrere Dateien mit leerzeichen habe, dann liefert `find ...` auch nur einen stream mit allen Ergebnissen hintereinander. ich kann die einzelnen dateien nicht mehr
    unterscheiden.
    In einer for schleife bekomme ich dann wieder die Fragmente des dateinamens.
     
  5. #4 bitmuncher, 21.01.2013
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    Die Dateinamen sind bei find durch Zeilenumbrüche getrennt. Du musst also nur den "Stream" bei den Zeilenumbrüchen splitten und hast die einzelnen Dateinamen.
     
  6. #5 floyd62, 21.01.2013
    floyd62

    floyd62 Routinier

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

    das wär dann wohl ein typischer Fall für "while" statt "for":
    Code:
    ls |       # oder find . -name "* *" -print
    while read i; do
        echo "$i"
    done
    
    Gruss, A.
     
  7. #6 aloisius, 22.01.2013
    aloisius

    aloisius Jungspund

    Dabei seit:
    24.04.2006
    Beiträge:
    16
    Zustimmungen:
    0
    Hallo,

    o.k. mit der while schleife klappt es.
    Dann gibt's gleich das nächste Problem. Ich lasse einen Zaehler für die Anzahl der Dateien mitlaufen:
    --------------------
    #!/bin/sh
    zaehler=5
    echo "Summe vorher : $zaehler "
    ls |
    while read i; do
    let zaehler=zaehler+1
    echo "File Nr. $zaehler , Name: $i "
    done

    echo "Summe nachher ist : $zaehler "
    -----------------
    Das script liefert:

    Summe vorher : 5
    File Nr. 6 , Name: Datei mit Leerzeichen
    File Nr. 7 , Name: check.sh
    File Nr. 8 , Name: noch eine Datei
    Summe nachher ist : 5

    was passiert hier ?
     
  8. #7 floyd62, 22.01.2013
    floyd62

    floyd62 Routinier

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

    die bash startet für die while-Loop, wenn diese von der Pipe liest, eine Sub-Shell. Der "$zaehler" wird nur in dieser Sub-Shell erhöht, in der Parent-Shell bleibt er unverändert.

    Um Werte, die innerhalb der Loop verändert werden, später weiterverwenden zu können, ist mehr Aufwand nötig:

    Du könntest versuchen, über exit oder echo die aktualisierten Werte an die Haupt-Shell zurückzuliefern, oder z.B. die Ausgabe von ls in einer Datei zu speichern. Wenn du diese Datei mit einer while-Loop liest, passiert das in der gleichen Shell, neue Werte der Variablen bleiben also nach dem Verlassen der Loop erhalten.

    Frage ist natürlich immer, wieviel Aufwand man betreiben will; wenn es nur darum geht, in Dateinamen Leerzeichen durch '_' zu ersetzen, kann man einfach zunächst testen mit z.B.
    Code:
    find . -name "* *" -print | while read F; do G=$(echo "$F" | tr " " "_"); echo mv "$F" "$G"; done
    
    Wenn das OK aussieht, lässt man einfach das echo for dem mv-Kommando weg ...

    A.
     
  9. dmaphy

    dmaphy Routinier

    Dabei seit:
    16.04.2004
    Beiträge:
    482
    Zustimmungen:
    0
    Ort:
    Hamburg
    Das einfachste wird sein, vor der for-Schleife den so genannten "internal field separator" von whitespaces auf ein anderes Zeichen zu setzen, welches nicht in den Dateinamen vorkommt und danach wieder zurück zu setzen:

    Code:
    #!/bin/sh
    OLDIFS=$IFS
    IFS=";"
    for i in `ls *`
    do
    echo $i
    done
    IFS=$OLDIFS
    
     
  10. #9 floyd62, 23.01.2013
    floyd62

    floyd62 Routinier

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

    eventuell ist nicht mal das Umsetzen/Rücksetzen von $IFS nötig: bei mir läuft das ganz einfach so, wenn die Shell selbst die Dateinamen expandiert, statt 'ls' zu bemühen:
    Code:
    for F in *; do echo "$F"; done
    
    Damit umgeht man auch das Problem, dass 'ls' (ohne die '-d'-Option) bei Verzeichnissen den Inhalt auflistet statt des Dateinamens.

    Gruss, A.
     
  11. #10 aloisius, 23.01.2013
    aloisius

    aloisius Jungspund

    Dabei seit:
    24.04.2006
    Beiträge:
    16
    Zustimmungen:
    0
    @ floyd62:
    >die bash startet für die while-Loop, wenn diese von der Pipe liest, eine Sub-Shell.
    >Der "$zaehler" wird nur in dieser Sub-Shell erhöht, in der Parent-Shell bleibt er unverändert.

    der zaehler wert wird doch von der parent shell uebernommen. die while schleife startet mit zaehler=5.
    das der veraenderte wert dann nicht zurueckgegeben wird erscheint mir unlogisch.
    entweder die variable ist lokal (dann muesste die subshell bei 0 anfangen) oder global.
     
  12. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  13. #11 Spröde, 23.01.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    Floyd62 hat Recht. Die Subshell übernimmt $zaehler von der Muttershell, aber nicht umgekehrt. Wie folgt formuliert, klappt es auch mit dem Zähler:
    Code:
    #!/bin/bash
    
    zaehler=5
    echo "Summe vorher : $zaehler "
    ls >/tmp/$$.tmp
    while read i; do
      ((zaehler++))
      echo "File Nr. $zaehler , Name: $i "
    done </tmp/$$.tmp
    
    echo "Summe nachher ist : $zaehler "
    
    rm /tmp/$$.tmp
    
     
  14. #12 karloff, 24.01.2013
    karloff

    karloff Routinier

    Dabei seit:
    09.07.2007
    Beiträge:
    317
    Zustimmungen:
    0
    Ort:
    ~/
    Wenns einfach nur um den count geht und nicht darum die nachher zuzuordnen würde auch ein

    find . -type f -name '*\ *' |wc -l

    ausreichen.
     
Thema: Wie finde ich Leerzeichen im dateinamen
Besucher kamen mit folgenden Suchen
  1. find Leerzeichen

Die Seite wird geladen...

Wie finde ich Leerzeichen im dateinamen - Ähnliche Themen

  1. Wo befindet sich der Autostartordner?

    Wo befindet sich der Autostartordner?: Hallo ich habe CentOS 7.2.15.11 und Desktopumgebung mate , wo befindet sich der Autostartordner?
  2. Rechner im lokalen Netzwerk finden

    Rechner im lokalen Netzwerk finden: Hallo, in meiner Firma habe ich zwei Linux-Rechner, die ganz modern mit dem Internet verbunden sind. Jetzt möchte ich von dem einem Rechner...
  3. BSI-Audit findet keine akuten Probleme in OpenSSL

    BSI-Audit findet keine akuten Probleme in OpenSSL: Das Bundesamt für Sicherheit in der Informationstechnik hat OpenSSL auf seine Sicherheit untersuchen lassen. Die Analyse zeigt vor allem, dass die...
  4. BSI-Audit findet keine akute Probleme in OpenSSL

    BSI-Audit findet keine akute Probleme in OpenSSL: Das Bundesamt für Sicherheit in der Informationstechnik hat OpenSSL auf seine Sicherheit untersuchen lassen. Die Analyse zeigt vor allem, dass die...
  5. GUADEC 2016 wird in Karlsruhe stattfinden

    GUADEC 2016 wird in Karlsruhe stattfinden: Das Gnome-Projekt lässt seine jährliche Konferenz GUADEC im kommenden Jahr nach Karlsruhe kommen. Einzelheiten werden im Lauf der nächsten Monate...