Zeige Ergebnis 1 bis 18 von 18
  1. #1
    gbrchlchkt
    Gast

    Dateiendungen mehrerer files aendern, shellscript noetig?

    Hallo,

    ich moechte mehrere Dateien mit der Endung .E so umbenennen, dass die Endung .e lautet. Dooferweise funktioniert

    mv *.E *.e

    nicht. Brauche ich etwa ein shellscript (das ich garnicht schreiben kann weil zu wenig Ahnung...) oder gibts da eine elegante Loesung?


    cheers..


  2. #2
    3ar1
    Gast
    Code:
    for f in `ls *.E`; do mv $f `basename $f .E`.e; done

  3. #3
    Benutzerbild von texray
    Registriert seit
    Jul 2001
    Beiträge
    1.537
    Likes
    0
    Und so funktioniert es auch mit Dateinamen, die Leerzeichen enthalten:
    Code:
    for f in *.E; do mv "$f" "`basename $f .E`".e; done

  4. #4
    Benutzerbild von GNU/colo
    Registriert seit
    Aug 2005
    Ort
    .at
    Beiträge
    1.361
    Likes
    3
    Und so kommt man ohne droelf Subshells aus:

    Code:
    for i in *.E; do mv "$i" "${i/.E/.e}"; done
    Eventueller Cornercase: der String ".E" kommt vor dem Ende des Dateinamens auch schon mal vor. Halte ich aber fuer verschmerzbar.

    GNU/Linux - empowering the brightest of minds.
    Code:
     ,= ,-_-. =.     /
    ((_/)o o(\_))   /  -o)
     `-'(. .)`-'   /   /\\
         \_/      /   _\_V

  5. #5
    baze
    Gast
    und thunar kann sowas inzwischen sogar für leute die keine shell mögen. obs schneller oder bequemer ist, sei dahingestellt

  6. #6
    Benutzerbild von texray
    Registriert seit
    Jul 2001
    Beiträge
    1.537
    Likes
    0
    Ich ziehe i. d. R. die Loesung vor, die ueberall (auf allen Rechnern und fuer alle Dateien) richtig funktioniert... wuerde auch noch einfacher (d.h. kuerzer) gehen mit Perl und einer regular expression, aber ich will edgewalker ja nicht alles vorwegnehmen
    (Also am schoensten find ich es sowieso mit rename (auf das ich den alias rn habe): rn 's/.E$/.e/g' * - einfacher und kuerzer als so gehts wirklich nicht mehr)

    Jetzt hab ichs doch vorweggenommen :o

  7. #7
    palandir
    Gast
    Original geschrieben von texray
    rn 's/.E$/.e/g' * - einfacher und kuerzer als so gehts wirklich nicht mehr)
    Doch!

    a) kann man den g-Schalter in dem Fall weglassen (".E" am Ende gibt es wenn dann nur ein Mal),
    b) kann man einen einbuchstabigen Alias verwenden!


  8. #8
    knisterwerk
    Gast
    Original geschrieben von GNU/colo
    Eventueller Cornercase: der String ".E" kommt vor dem Ende des Dateinamens auch schon mal vor. Halte ich aber fuer verschmerzbar.
    mv "$i" "${i%.E}.e"

    Und um die letzten Fehlerquellen zu beseitigen, nimmt man am besten find:
    Code:
    find . -depth 1 -name '*.E' -exec sh -c 'mv "$0" "${0%.E}.e"' {} \;

  9. #9
    Chawki
    Gast
    Original geschrieben von knisterwerk
    mv "$i" "${i%.E}.e"

    Und um die letzten Fehlerquellen zu beseitigen, nimmt man am besten find:
    Code:
    find . -depth 1 -name '*.E' -exec sh -c 'mv "$0" "${0%.E}.e"' {} \;
    Ja, find ist dafür am besten geeignet, insbesondere bei Dateinamen, die ein oder mehrere Newline enthalten

  10. #10
    Houzer&Deif
    Gast
    Original geschrieben von nobody0
    Ja, find ist dafür am besten geeignet, insbesondere bei Dateinamen, die ein oder mehrere Newline enthalten
    *hehe*

    Is teh correct. Aber noch zwei Anmerkungen.

    1) -type f, damit wirklich nur Dateien gefunden werden
    2) nicht mit -exec arbeiten, sondern mit der Pipe nach xargs. Ist perfomanter.

  11. #11
    edgewalker
    Gast
    Original geschrieben von Houzer&Deif
    2) nicht mit -exec arbeiten, sondern mit der Pipe nach xargs. Ist perfomanter.
    Sinnlos, musst eh ein mv per Datei aufrufen. Wenn du Performance willst, nimmst du was anderes als Shell-Kommandos, wo du zwangsweise einen Prozess per rename investieren musst – etwa mein Perl-Programm.

  12. #12
    gbrchlchkt
    Gast
    Hilfe, was hab ich nur losgetreten.

    Performance ist auch so ok, mit den obigen Befehlen, es geht ja nur um ca. 20 kleine Dateien pro Verzeichnis. (Warum darf man eigentlich nicht Ordner sagen? )

    Original geschrieben von knisterwerk
    mv "$i" "${i%.E}.e"
    Hmm, das ist ja meiner urspruenglichen Idee mv *.E *.e ja schon wieder viel aehnlicher. Also das %.E entfernt sozusagen das .E aus der Variablen i?

    Original geschrieben von palandir
    Doch!

    a) kann man den g-Schalter in dem Fall weglassen (".E" am Ende gibt es wenn dann nur ein Mal),
    b) kann man einen einbuchstabigen Alias verwenden!

    Wenn dann richtig!


    So langsam faengt das Linuxen auch an Spass zu machen. Nach einiger Frickelei habe ich auch mein erstes Shellscript zusammenbekommen, das nun im ~/bin rumliegt und auf seine Aufrufe wartet.

    Auch wenn Ubuntu in dieser Runde sicher nur ein muedes Gaehnen hervorruft bin ich damit ganz zufrieden. Werd morgen aber trotzdem mal KDE draufmachen und antesten (reine Neugier und Gnome hat ein paar Dinge die echt nerven..)

    Jetzt muesste ich nur noch von heute auf morgen Fortran verstehen und dann waer's perfekt.

    cipot-ffo

  13. #13
    edgewalker
    Gast
    Original geschrieben von volcano freak
    Also das %.E entfernt sozusagen das .E aus der Variablen i?
    Vom Ende der Variablen, ja.

    Auch wenn Ubuntu in dieser Runde sicher nur ein muedes Gaehnen hervorruft
    Wieso? Ich finde nicht, dass man gegen Bequemlichkeit sein muss, um richtiger Linuxer zu sein.

  14. #14
    Benutzerbild von texray
    Registriert seit
    Jul 2001
    Beiträge
    1.537
    Likes
    0
    Trotzdem noch eine kleine Anmerkung, nicht dass es untergeht: Wenn du die Variante mv "$i" "${i%.E}.e" verwenden willst, brauchst du trotzdem das for-Konstrukt aus den ersten paar Antworten.

  15. #15
    Houzer&Deif
    Gast
    Original geschrieben von edgewalker
    Sinnlos, musst eh ein mv per Datei aufrufen. Wenn du Performance willst, nimmst du was anderes als Shell-Kommandos, wo du zwangsweise einen Prozess per rename investieren musst – etwa mein Perl-Programm.
    Imho sollte aber auch bei mv oder cp nur ein Prozess aufgemacht werden. Bin jetzt nicht so der Crack aber mir hat man xargs als technisch überlegen und besser verkauft - weil es eben Resourcen schont.

    Das mit Perl ist schon ein feine Sache aber wenn du (z.B. beruflich bedingt) kein Perl hast oder benutzen kannst. Ähm, dann bleibt ja eigentlich nicht mehr viel ausser plain shell (und wenn du Pech hast: ksh)

    Aber das schöne ist: Verdammt viele Wege führen zum Ziel. Eben ist mir noch eine kranke Sache mit 'sed' eingefallen..

  16. #16
    edgewalker
    Gast
    Original geschrieben von Houzer&Deif
    mir hat man xargs als technisch überlegen und besser verkauft - weil es eben Resourcen schont.
    xargs ist nicht einfach »besser«. Solche Sprüche einfach ohne Verständnis herunterzubeten, bringt dir nichts. xargs hilft, viele Dateien pro Aufruf auf einmal zu verarbeiten. Leider kannst du mit mv nur eine Datei pro Aufruf umbenennen. Also spielt es überhaupt garkeine Rolle, ob du deine mvs per xargs oder per -exec anstösst.

    Ähm, dann bleibt ja eigentlich nicht mehr viel ausser plain shell
    Und damit ein Prozess pro Umbenennung. Effizienter geht es mit Shell nicht, und wenn du dich noch so windest.

    Eben ist mir noch eine kranke Sache mit 'sed' eingefallen..
    Die läuft auch auf mv-Aufrufe hinaus und ist daher nicht effizienter als jede andere Lösung mit Shell auch. Im übrigen wird diese Lösung wahrscheinlich unter Schwierigkeiten mit Sonderzeichen wie Leerschritten und Backslashes leiden.

  17. #17
    Benutzerbild von Mithrandir
    Registriert seit
    Aug 2000
    Ort
    Aachen
    Beiträge
    3.986
    Likes
    0
    Original geschrieben von texray
    (Also am schoensten find ich es sowieso mit rename (auf das ich den alias rn habe): rn 's/.E$/.e/g' * - einfacher und kuerzer als so gehts wirklich nicht mehr)
    Ist das nicht leicht gefährlich? rn und rm liegen sehr sehr dicht beieinander
    [small]Viele Namen habe ich in vielen Ländern. Mithrandir heiße ich bei den Elben, Tharkûn bei den Zwergen;
    Olórin war ich in meiner Jugend im Westen, der vergessen ist, im Süden Incánus, im Norden Gandalf; in den Osten gehe ich nicht.


    J.R.R. Tolkien - The Lord Of The Rings[/small]

  18. #18
    Benutzerbild von texray
    Registriert seit
    Jul 2001
    Beiträge
    1.537
    Likes
    0
    Hm ja stimmt
    Bis jetzt ist noch nix passiert... aber ich wollte mal irgendwie eine Abfrage bei rm einbauen, dass, sobald ein Dateiname in der Parameterliste mehr als einmal oder gar nicht existiert, eine zusaetzliche Abfrage eingeblendet wird (das wuerde hier helfen, und auch, wenn man versehentlich sowas eingibt wie: rm * .txt)

Forumregeln

  • Es ist dir nicht erlaubt, neue Themen zu verfassen.
  • Es ist dir nicht erlaubt, auf Beiträge zu antworten.
  • Es ist dir nicht erlaubt, Anhänge hochzuladen.
  • Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
  •