Shellscript: Dateiendung anhängen



  • YUHU, jetzt gehts 👍

    Danke!!!



  • Ok hab das ganze gerade an den Orginaldaten ausprobiert. Das Problem ist jetzt nur, dass ganz vieeele Leerzeichen und Punkte in den Dateinamen sind 😡 . Die kanne das Script jetzt natürlich nicht verarbeiten. Gibts da irgend eine Lösung?

    Danke



  • Versuch mal

    mv "$i" "$i.$2"
    


  • @Fubar

    Das hab ich schon, aber find hat das grössere Problem. Ich weiss nicht wellche Hochkommas ich wo hintunmuss, dasmit es die Ordner mit Leerzeichen auch nimmt. 😞

    Aber Danke für die Hilfe!



  • Und dann noch:

    for i in "`find $1/* -type f`"; 
    ...
    

    Dann funktioniert es hoffentlich ...

    Ansonsten poste mal die Ausgabe von

    for i in "`find $1/* -type f`"; do echo "$i"; done
    

    Edit: Hups, kleiner Fehler.



  • Deine Probleme liegen an dem "for i in `find`", find kann zB "eine Datei mit Leerzeichen" zurückgeben und dann weiß die Bash nicht dass das nur eine einzelne Datei ist. Das ist eben der Nachteil wenn Shells keine richtigen Arrays können...



  • Hat jemand vielleicht eine Idee oder weiss ein Tool wo Leerzeichen berücksichtigt werden. Zur Not auch für Windows 🤡



  • Hallo,

    wieso denn für Windows 😮 ?
    Unter GNU 🙂 /Linux sollte es mit der bash, find und xargs folgendermaßen funktionieren:

    find "$1/*" -type f -print0 -exec xargs -0 mv '{}' \{\}.$2 \;
    

    Dadurch werden die Dateinamen mit Nullzeichen (ASCII-Code 0) getrennt, es gibt also kein Problem mit Leerzeichen mehr. Die {} müssen mit '' oder \ vor der Shell geschützt werden (werden von find durch die gefundenen Dateinamen ersetzt).

    Mit freundlichen Grüßen

    Linuxfreak



  • Poste doch bitte nochmal Dein Testprogramm und die Fehlermeldungen, grundsätzlich ist der Ansatz doch nicht soo schlecht...

    edit: Hm, nur 5 Minuten zu spät... 😉



  • @Linuxfreak,

    Habe gerade deine Lösung getestet. Find sagt mir, dass das angegebene Verzeichniss nicht existiert.



  • Hast du meinen 2. Vorschlag [s.o.] schon getestet? Und wie hast du Linuxfreaks Version aufgerufen?



  • @fubar:

    Deine Lösung (

    #!/bin/bash
    for i in "`find 1/* -type f\`"; do echo "i"; done

    )

    funktioniert zwar, es werden alle Dateien aufgelistet,

    aber bei (

    #!/bin/bash
    for i in "`find 1/* -type f\`"; do mv "i" "$i.tif"; done

    )

    werden alle Dateinamen aneinandergefügt und mv meldet: File name too long

    Die Lösung von Linuxfreak hab ich in eine Datei geschrieben:

    #!/bin/bash
    find "$1/*" -type f -print0 -exec xargs -0 mv '{}' \{\}.$2 \;

    und mit ./rename.sh verzeichnis endung ausgeführt

    Es heisst dann: find: verzeichnis/*: No such file or directory

    Ich glaub ich bring ein Buch raus: "Jetzt lerne ich Shellscript in 21 Posts" 😃



  • Hab noch das gefunden:

    find "dir" -type f -print | while read f; do n="\`dirname \\"f\"`/`basename \"f\\" | sed 's/ /_/g'\`" if test -e "n"; then
    echo "Ziel \"n\\" existiert" >&2 else mv "f" "$n"
    fi
    done

    Sagt mir aber dann: find: invalid predicate `'

    PS: Geklaut von: http://www.jan-trippler.de/quickies/files.html



  • pasti schrieb:

    Ok hab das ganze gerade an den Orginaldaten ausprobiert. Das Problem ist jetzt nur, dass ganz vieeele Leerzeichen und Punkte in den Dateinamen sind 😡 . Die kanne das Script jetzt natürlich nicht verarbeiten. Gibts da irgend eine Lösung?

    Danke

    😃

    Das kann man wirklich als Buch rausbringen. Köstlich
    Die Leerzeichen kann man ja auch ersetzen, jetzt wird's lustig:

    #!/bin/bash
    
    for i in `find $1/* -type f`; do
    realname=`echo $i | sed "s/ /\\ /"`
     mv $realname $realname.$2
    done;
    

    Ungeprüft, kann das mal jemand vereinfachen!
    Evtl. mit Xargs 😃



  • ºgrimmsenº® schrieb:

    #!/bin/bash
    
    for i in `find $1/* -type f`; do
    

    Peng, genau hier liegt der Fehler. 🙂
    Stell Dir mal vor $1 ist foo und in foo liegt eine Datei namens "baz bar" (mit Leerzeichen).
    Was wird dann die Bash wohl (in Ermangelung eines echten Array-Typs) machen?
    Genau! foo/baz und bar getrennt bearbeiten. 🙂



  • So, einmal will ich aber auch noch 😉

    #!/bin/bash
    find "$1"/* -type f -exec mv '{}' \{\}.$2 \;

    😕



  • @nman:

    Logisch... Denkfehler meinerseits
    Wie wäre das:

    #!/bin/bash
    
    for i in `find $1/* -type f | sed "s/ /\\/g"`; do
    realname=`echo $i | sed "s/\\/\\ /g"`
     mv $realname $realname.$2
    done;
    

    Mmmh... müßte funzen, oder pasti 😃



  • Und nachdem ich mir das ganze hier nicht länger ansehen kann: 😉
    Probier mal sowas:

    #!/bin/bash
    find "$1" -type f -exec mv '{}' \{\}.$2 \;
    


  • ºgrimmsenº® schrieb:

    Wie wäre das:

    #!/bin/bash
    for i in `find $1/* -type f | sed "s/ /\\/g"`; do
    

    Schlecht, probiers aus. 😃



  • Hab mich ja schon entschuldigt...

    🙄


Anmelden zum Antworten