Hallo Liste! Für ein Backup-Script brauche ich dringend eine Lösung. Wir finden die zu backupenden Dateien durch einen find und schreiben die Namen in eine Variable: VARIABLE=`find /dir -name "*.bck"` Danach wollen dir die Dateien kopieren: for i in $VARIABLE; do cp "$i" /ziel done find füllt die Variable wunderbar, doch das Problem entsteht, wenn kopiert werden soll. Dateien, die Leerzeichen enthalten, werden durch for als zwei Werte interpretiert. find schreibt in VARIABLE: /daten/Datei 1.doc cp will kopieren: /daten/Datei 1.doc Ein find -printf "\"%p\"\n" war nicht erfolgreich, da for die Anführungszeichen als zum Dateinamen gehörend interpretiert. Das liefert find schreibt in VARIABLE: "/daten/Datei 1.doc" cp will kopieren: "/daten/Datei 1.doc" Wie kann ich das Ganze umstricken? Wie würde der find-Befehl mit -exec aussehen? Leider ist es nur schwer möglich, auf die for-Schleife zu verzichten, da noch einiges anderes mit der Datei gemacht wird, aber notfalls kann ich darauf zurückweichen. Die Lösung mit for wäre mir aber lieber. Wie kann ich dieses Problem lösen? Gruß und Dank im voraus, Andreas
Am Mit, 21 Nov 2001 schrieb Andreas Achtzehn:
Für ein Backup-Script brauche ich dringend eine Lösung. Wir finden die zu backupenden Dateien durch einen find und schreiben die Namen in eine Variable:
VARIABLE=`find /dir -name "*.bck"` Danach wollen dir die Dateien kopieren: for i in $VARIABLE; do cp "$i" /ziel done
find füllt die Variable wunderbar, doch das Problem entsteht, wenn kopiert werden soll. Dateien, die Leerzeichen enthalten, werden durch for als zwei Werte interpretiert.
find schreibt in VARIABLE: /daten/Datei 1.doc cp will kopieren: /daten/Datei 1.doc
Schreibe einfach $VARIABLE in Anführungszeichen (doppelte, also ") und Dein Problem ist gelöst. Bsp.: ma@gbp301:~ > TESTVAR="EIN TEST" ma@gbp301:~ > for i in $TESTVAR; do echo $i; done EIN TEST ma@gbp301:~ > for i in "$TESTVAR"; do echo $i; done EIN TEST Gruß Christoph -- Christoph Maurer - Paul-Röntgen-Straße 7 - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
Moin,
* Christoph Maurer
Am Mit, 21 Nov 2001 schrieb Andreas Achtzehn:
Für ein Backup-Script brauche ich dringend eine Lösung. Wir finden die zu backupenden Dateien durch einen find und schreiben die Namen in eine Variable:
VARIABLE=`find /dir -name "*.bck"` Danach wollen dir die Dateien kopieren: for i in $VARIABLE; do cp "$i" /ziel done
find füllt die Variable wunderbar, doch das Problem entsteht, wenn kopiert werden soll. Dateien, die Leerzeichen enthalten, werden durch for als zwei Werte interpretiert. Schreibe einfach $VARIABLE in Anführungszeichen (doppelte, also ") und Dein Problem ist gelöst. Bsp.: ma@gbp301:~ > TESTVAR="EIN TEST" ma@gbp301:~ > for i in $TESTVAR; do echo $i; done EIN TEST ma@gbp301:~ > for i in "$TESTVAR"; do echo $i; done EIN TEST zsh macht's wieder anders, aber so geht's nicht:
hde@acp1130> TESTVAR="file1 file 2 file3" hde@acp1130> for i in $TESTVAR; do echo $i; done file1 file 2 file3 hde@acp1130> for i in "$TESTVAR"; do echo $i; done file1 file 2 file3 hde@acp1130> bash %n@%m:%~ > TESTVAR="file1 file 2 file3" %n@%m:%~ > for i in $TESTVAR; do echo $i; done file1 file 2 file3 %n@%m:%~ > for i in "$TESTVAR"; do echo $i; done file1 file 2 file3 Thorsten -- They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety. - Benjamin Franklin
On Wednesday, 21. November 2001 15:27, Andreas Achtzehn wrote:
Hallo Liste!
Für ein Backup-Script brauche ich dringend eine Lösung. Wir finden die zu backupenden Dateien durch einen find und schreiben die Namen in eine Variable:
VARIABLE=`find /dir -name "*.bck"` Danach wollen dir die Dateien kopieren: for i in $VARIABLE; do cp "$i" /ziel done
find füllt die Variable wunderbar, doch das Problem entsteht, wenn kopiert werden soll. Dateien, die Leerzeichen enthalten, werden durch for als zwei Werte interpretiert.
find schreibt in VARIABLE: /daten/Datei 1.doc cp will kopieren: /daten/Datei 1.doc
[....] Hier ist ein kleines Skript mit dem Du die spaces aus den Dateinamen entfernen kannst. Das ist durchaus sinnvoll. Der Gag besteht im IFS (InputFileSeparator). Wenn Du den so einstellst, daß nur newlines als Trennzeichen gelten klappt es auch mit Deinem Script. ----------------------------------------------------------- #!/bin/bash # # Den InputFieldSeparator sichern <space><tab><newline> # Save the old InputFieldSeparator <space><tab><newline> ALT_IFS=$IFS # Zeilenumbruch in IFS schreiben # Store newline to IFS IFS=' ' # Dateien mit Leerzeichen im Namen finden und in die Schleife # übergeben # Find files with spaces in name and tranfer the list to loop for i in $(find -maxdepth 1 -name "*\ *") ; do # Leerzeichen ersetzen # Replace spaces j=$(echo $i | sed -e s/\ /_/g ) # Kontrollausgabe # output for control # echo $i" -> "$j # umbenennen # rename files mv "$i" "$j" done # alten IFS wieder herstellen # replace old IFS IFS=$ALT_IFS ----------------------------------------------------------------- Gruß Peter
From: Peter Bossy [mailto:p.bossy@vorwerk-automotive.de] Sent: Wednesday, November 21, 2001 3:46 PM To: suse-linux@suse.com Subject: Re: bash word
On Wednesday, 21. November 2001 15:27, Andreas Achtzehn wrote:
Hallo Liste!
Für ein Backup-Script brauche ich dringend eine Lösung. Wir finden die zu backupenden Dateien durch einen find und schreiben die Namen in eine Variable:
VARIABLE=`find /dir -name "*.bck"` Danach wollen dir die Dateien kopieren: for i in $VARIABLE; do cp "$i" /ziel done
find füllt die Variable wunderbar, doch das Problem entsteht, wenn kopiert werden soll. Dateien, die Leerzeichen enthalten, werden durch for als zwei Werte interpretiert.
find schreibt in VARIABLE: /daten/Datei 1.doc cp will kopieren: /daten/Datei 1.doc
[....]
Hier ist ein kleines Skript mit dem Du die spaces aus den Dateinamen entfernen kannst. Das ist durchaus sinnvoll.
Der Gag besteht im IFS (InputFileSeparator). Wenn Du den so einstellst, daß nur newlines als Trennzeichen gelten klappt es auch mit Deinem Script.
----------------------------------------------------------- #!/bin/bash # # Den InputFieldSeparator sichern <space><tab><newline> # Save the old InputFieldSeparator <space><tab><newline> ALT_IFS=$IFS
# Zeilenumbruch in IFS schreiben # Store newline to IFS IFS=' ' # Dateien mit Leerzeichen im Namen finden und in die Schleife # übergeben # Find files with spaces in name and tranfer the list to loop for i in $(find -maxdepth 1 -name "*\ *") ; do
# Leerzeichen ersetzen # Replace spaces j=$(echo $i | sed -e s/\ /_/g )
# Kontrollausgabe # output for control # echo $i" -> "$j
# umbenennen # rename files mv "$i" "$j"
done
# alten IFS wieder herstellen # replace old IFS IFS=$ALT_IFS -----------------------------------------------------------------
Gruß
Peter
Spitze, die Lösung hat mir geholfen. Jetzt wird alles sauber gebackupt. Danke an alle, die sich an IFS erinnert haben! Gruß, Andreas
Andreas Achtzehn wrote:
Hallo Liste!
Für ein Backup-Script brauche ich dringend eine Lösung. Wir finden die zu backupenden Dateien durch einen find und schreiben die Namen in eine Variable:
VARIABLE=`find /dir -name "*.bck"` Danach wollen dir die Dateien kopieren: for i in $VARIABLE; do cp "$i" /ziel done
find füllt die Variable wunderbar, doch das Problem entsteht, wenn kopiert werden soll. Dateien, die Leerzeichen enthalten, werden durch for als zwei Werte interpretiert.
find schreibt in VARIABLE: /daten/Datei 1.doc cp will kopieren: /daten/Datei 1.doc
Ein find -printf "\"%p\"\n" war nicht erfolgreich, da for die Anführungszeichen als zum Dateinamen gehörend interpretiert. Das liefert
find schreibt in VARIABLE: "/daten/Datei 1.doc" cp will kopieren: "/daten/Datei 1.doc"
Wie kann ich das Ganze umstricken? Wie würde der find-Befehl mit -exec aussehen? Leider ist es nur schwer möglich, auf die for-Schleife zu verzichten, da noch einiges anderes mit der Datei gemacht wird, aber notfalls kann ich darauf zurückweichen. Die Lösung mit for wäre mir aber lieber.
Wie kann ich dieses Problem lösen?
#!/bin/bash IFS=" " VARIABLE=`find ./ -type f -name "*.bck" | xargs --null` for i in $VARIABLE; do /bin/cp $i "$i.back" done Vielleicht so? Gruß Daniel
participants (5)
-
Andreas Achtzehn
-
Christoph Maurer
-
D. Wolpert
-
Peter Bossy
-
Thorsten Haude