• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Kopieren von Verzeichnissen

Frankie777

Advanced Hacker
Hallo,

ich möchte per Script

/bla/fasel/$immeranders/verz/*datei

Dateien kopieren, bzw. sichern.

Gibt es eine einfache Möglichkeit dazu?
 
OP
Frankie777

Frankie777

Advanced Hacker
/bla/fasel/$immeranders/verz/*datei

Du meinst

cd /bla/fasel
cp -r verz/*datei /Sicherung
würde funktionieren?

Wichtig ist das eben nur Dateien kopiert werden, die die "Eigenschaft" verz/*datei haben und nicht dhhdh/*datei.
 
OP
Frankie777

Frankie777

Advanced Hacker
Leider funktioniert das nicht mit einem einfachen copy Befehl mit recursiven kopieren.

Ich mache jetzt ein ls auf das Verzeichnis und speichere die Unterverzeichnisse in einer Datei. Das funktioniert soweit auch ganz gut.

ls -lbgG "/mnt/windows/server01/Dokumente und Einstellungen" | grep -i ":" | cut -d " " -f 7- > liste.txt

Wenn ich Datei mit cat ausgebe sieht auch alles gut aus.

Nur wenn ich
for i in `cat liste.txt` ; do
benutze dann hat er Probleme mit den Leerzeichen in den Verzeichnisnamen und macht bei jedem Leerzeichen "\ " einen Zeilenumbruch.

Was kann man das verhindern?
 

TeXpert

Guru
mir ist immer noch nicht genau klar was Du willst gibt ein konkretes Beispiel.

Dateinamen mit Leerzeichen sind immer Böse -> Quoten.
ein umweg über ls und Datei ist in 99.999999% der Fälle überflüssig, es gibt find.
 
OP
Frankie777

Frankie777

Advanced Hacker
Ich möchte im Ergebnis Dateien "datei.txt" im Verzeichnis verz/ kopieren.

Im Verzeichnis /bla/fasel gibt es beliebig viele Unterverzeichnisse mit Namen, die eben auch Leerzeichen beeinhalten können.

/bla/fasel/$immeranders/verz/datei.txt

Das Srcript funktioniert auch soweit, nur macht der cat Befehl in der Schleife eben aus einem Leerzeichen einen Zeilenumbruch.
 

taki

Advanced Hacker
Frankie777 schrieb:
/bla/fasel/$immeranders/verz/*datei

Du meinst

cd /bla/fasel
cp -r verz/*datei /Sicherung
würde funktionieren?

Wichtig ist das eben nur Dateien kopiert werden, die die "Eigenschaft" verz/*datei haben und nicht dhhdh/*datei.

Meintest Du evtl. eher

Code:
cd /bla/fasel
cp -r verz/* /Sicherung

?
 
OP
Frankie777

Frankie777

Advanced Hacker
Nochmal anders beschrieben:

Ich will alle DIESEDATEI.TXT kopieren

/mnt/windows/server01/Dokumente und Einstellungen/USER/verzeichnis1/verzeichnis2/DIESEDATEI.TXT

Wobei es USER eben n-mal gibt.

Ich will aber nur diese Datei kopieren, und auch nur die Datei aus dem Verzeichnisbaum verzeichnis1/verzeichnis2/ und nicht aus einem anderen Verzeichnisbaum...
 

taki

Advanced Hacker
Kann USER auch Leerstellen enthalten? Sonst müsste wohl das hier funktionieren.

Code:
cd "/mnt/windows/server01/Dokumente und Einstellungen"
for USER in `ls`; do
   cp "$USER/verzeichnis1/verzeichnis2/DIESEDATEI.TXT" "/Sicherung"
done
 
OP
Frankie777

Frankie777

Advanced Hacker
So eine ähnliche Lösung mit Schleife hatte ich schon, nur leider sind Leerzeichen vorhanden...
 

taki

Advanced Hacker
Frankie777 schrieb:
So eine ähnliche Lösung mit Schleife hatte ich schon, nur leider sind Leerzeichen vorhanden...

In den Usernamen? Dann müssen wir die verstecken.

Vielleicht so: In der Schleifenbedingung maskieren wir die Leerzeichen, indem wir ein Zeichen einsetzen, welches vom Dateisystem garantiert nicht verwendet werden kann. Vor dem Kopieren müssen wir das Leerzeichen wieder herstellen. Beim Kopieren selbst sollten die Leerzeichen nicht stören, da der Pfad ja in Gänsefüßen steht.

Code:
cd "/mnt/windows/server01/Dokumente und Einstellungen" 
for USER in `ls |tr " " \!`; do
   USERDIR=`echo $USER |tr \! " "`
   cp "$USERDIR/ein verzeichnis/noch ein verzeichnis/DIESE DATEI.TXT" "/Sicherung" 
done

Es gibt bestimmt elegantere Lösungen, aber diese müsste m.E. funktionieren.
 

TeXpert

Guru
taki schrieb:
In den Usernamen? Dann müssen wir die verstecken.
also einfach quoten:

Code:
cd /foobar
for d in "`ls -1`"
do 
  cp "$d/foo/bar/datei.txt" backup
done
dabei ist Annahme, dass in dem Verzeichnis nur die Verzeichnisse drinstehen.

natürlich gerne auch mit while möglich (das ist manchmal etwas einfacher bzgl. des quotens..)
Code:
ls -1 | while read d ; do cp "$d/foobar" /sicherung/. ; done

das Hauptproblem ist: mit der Lösung von taki und von mir werden Dateien mit gleichem Namen überschrieben! also user1 hat foobar.txt und user 2 auch.. hier wird beim Kopieren kein Verzeichnisbaum aufgebaut!
 

taki

Advanced Hacker
TeXpert schrieb:
taki schrieb:
In den Usernamen? Dann müssen wir die verstecken.
also einfach quoten:

Code:
cd /foobar
for d in "`ls -1`"
do 
  cp "$d/foo/bar/datei.txt" backup
done
dabei ist Annahme, dass in dem Verzeichnis nur die Verzeichnisse drinstehen.

Hast Du das ausprobiert? M.E. funktioniert das nicht, weil eben der "for" beim Leerzeichen umbricht. So verarbeitet jeder Schleifendurchlauf genau ein Wort.

TeXpert schrieb:
natürlich gerne auch mit while möglich (das ist manchmal etwas einfacher bzgl. des quotens..)
Code:
ls -1 | while read d ; do cp "$d/foobar" /sicherung/. ; done

Das sieht viel besser aus. Wieder etwas gelernt.

TeXpert schrieb:
das Hauptproblem ist: mit der Lösung von taki und von mir werden Dateien mit gleichem Namen überschrieben! also user1 hat foobar.txt und user 2 auch.. hier wird beim Kopieren kein Verzeichnisbaum aufgebaut!

Ja.
 
OP
Frankie777

Frankie777

Advanced Hacker
so funktioniert es und die Leerzeichen werden auch richtig behandelt!

Den Target Namen kann ich mir selbst zusammen setzen.


Vielen Dank!
 

TeXpert

Guru
taki schrieb:
Hast Du das ausprobiert?

in der Form hab ich schon mal was gebastelt :) (ach ja: Bash ist blöd...) aber jetzt konkret... war das wohl doch etwas anderes, wir mir ein kleiner Test beweist :)

Code:
Linux-Club-Demo: ls -l
insgesamt 0
drwxr-xr-x  2 xxx xxx 6 2005-11-10 09:50 aa\ bb
drwxr-xr-x  2 xxx xxx 6 2005-11-10 09:50 aa\ cc
drwxr-xr-x  2 xxx xxx 6 2005-11-10 09:51 abc
drwxr-xr-x  2 xxx xxx 6 2005-11-10 09:51 ab cd
drwxr-xr-x  2 xxx xxx 6 2005-11-10 09:51 dd\ cc
drwxr-xr-x  2 xxx xxx 6 2005-11-10 09:51 rr\ ss
drwxr-xr-x  2 xxx xxx 6 2005-11-10 09:51 uv wq
drwxr-xr-x  2 xxx xxx 6 2005-11-10 09:51 xyz
Linux-Club-Demo: for d in "`ls -1`" ; do echo "$d" ; done
aa\ bb
aa\ cc
abc
ab cd
dd\ cc
rr\ ss
uv wq
xyz
Linux-Club-Demo: for d in "`ls -1`" ; do touch "$d/aaa" ; done
touch: kann ,,aa\\ bb\naa\\ cc\nabc\nab cd\ndd\\ cc\nrr\\ ss\nuv wq\nxyz/aaa" nicht berühren: Datei oder Verzeichnis nicht gefunden

M.E. funktioniert das nicht, weil eben der "for" beim Leerzeichen umbricht. So verarbeitet jeder Schleifendurchlauf genau ein Wort.
nein, er bekommt genau einen Wert.... ich überlege gerade wie ich das mal umgangen hatte....
TeXpert schrieb:
natürlich gerne auch mit while möglich (das ist manchmal etwas einfacher bzgl. des quotens..)
Code:
ls -1 | while read d ; do cp "$d/foobar" /sicherung/. ; done
Das sieht viel besser aus. Wieder etwas gelernt.

jepp, das nutzte ich an sich gerne ...
 
Oben