1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Script Dateien kopieren/umbenennen

Discussion in 'Linux-Distributionen' started by SchneeMann3000, May 21, 2005.

Thread Status:
Not open for further replies.
  1. Hallo,

    ich habe folgendes Problem:
    Ich habe einen Ordner in dem befinden sich etliche Dateien mit der Endung *.doc! Nun brauche ich ein Script das mir einfach nur eine leere Datei aus allen *.doc Dateien erstellt mit dem Namen *.bak

    Folgendes habe ich ausprobiert und ist genau das was ich brauche, aber es funktioniert nicht, wenn die Dateien Leerzeichen enthalten und das tun etliche Dateien leider :-(

    for i in $(ls *.doc); do touch $i ${i%.*}.bak; done

    Weiss jemand wie ich das umschreiben muss das es auch mit Leerzeichen funktioniert? Also ohne Leerzeichen geht es!!!

    Ich hoffe ihr könnt mir helfen ich verzweifle grad. :aua: Kenn mich mit der Bash leider nicht gut aus.

    Vielen Dank schon einmal im vorraus
     
  2. cirad

    cirad Kbyte

    for a in *.doc; do touch "${a%.doc}.bak"; done
     
  3. Affirmation

    Affirmation Kbyte

    Du musst den $IFS (=internal field separator, Spezialvariable zur Erkennung zwischen Programmname und Parametern -> Standardmäßig das Leerzeichen) umsetzen:

    #!/bin/bash
    IFS=$'\n';
    for i in $(ls *.doc); do
    touch $i ${i%.*}.bak;
    done;
    IFS=$' ';

    Zunächst wird das auf eine neue Zeile gesetzt (das Zeichen is ja bei Dateinamen nicht legal, daher ideal), und dann die for-Schleife durchlaufen.
    Am Ende setzt du das wieder auf den normalen Fall zurück.
     
  4. Danke das funktioniert :)

    @Affirmation

    Was macht eigentlich das
    IFS=$'\n';
    und
    IFS=$' ';

    Kenne mich leider nur sehr schlecht aus :(

    Also danke
    Gruß
    snowman
     
  5. cirad

    cirad Kbyte

    Hilfe, nein. Gewöhn dir das mit IFS am besten ab. In seinem Fall hätten einfach "" um die Variablen gereicht. Ich hatte ihm nur die komplett neue Zeile hingeschrieben, weil das mit dem touch fehlerhaft und mit dem $(ls *doc) absolut unnötig war.

    Und wenn du schon irgendwo zeilweise einlesen willst, dann tut es auch ein while read a; do ...

    @Affirmation
    > Was macht eigentlich das [...]
    IFS ist eine Variable, deren Inhalt die SH oder Bash als Trennzeichen für das Erweitern benutzt. So wird beispielsweise bei $* die Ausgabe der einzelnen Parameter mit dem ersten Zeichen in IFS getrennt.

    Hier wird IFS geändert, damit nur Zeilenweise (Newline als Trennzeichen) und nicht Wortweise (Leerzeichen oder Tab als Trennzeichen) vorgegangen wird. Da sich IFS aber eben auch auf anderes auswirkt, sollte man sowas nicht tun, zumal es hier unnötig ist.
     
Thread Status:
Not open for further replies.

Share This Page