Datein verschieben mit find, xargs und mv

robi

Member
Hallo!

Mich würde gerne interressieren, ob das geht, das bestimmte Dateien die ein einem Verzeichniss und deren Unterverzeichniss verstreut sind, in ein anderes übergeordnetes Verzeichniss mit der selben Unterverzeichniss Struktur kopieren kann.

Folgendes Szenario:

unter /foo/bar sind mehrere *.gif bilder verstreut:
/foo/bar/ordner 1/test1.gif
/foo/bar/ordner 2/unterordner1/test2.gif
/foo/bar/ordner_3/unterordner3/unterunterordner4/test3.gif

so und ich wollte die ganzen *.gif bilder in einen anderen Ordner kopieren, nämlich

/hugo/uga/ aber mit der gleichen Verzeichniss Hierachie... also soll das ganze dann so ausschauen

/hugo/uga/ordner_1/test1.gif
/hugo/uga/ordner_2/unterordner1/test2.gif
/hugo/uga/ordner_3/unterordner3/unterunterordner4/test3.gif

also machte ich mich dran und gab folgendes Kommando ein

find /foo/bar/ -depth -name "*.gif" -print0 | xargs -i -t mv-f {} /hugo/uga/{}

(print0 weil ich auch *gif wie ._paris.gif oder _fu^r Adam.gif)
und bekomme dann immer ein

mv: cannot stat

das liegt daran glaub ich weil er Ordner 2 nicht als Ordner\ 2 übergibt oder? Wie kann ich das denn ändern ?

Danke schon mal im voraus.

Liebe Grüße

Robert

PS: Vielleicht sollte ich umschwenken auf find -exec ... mv.. ?
 
Ich weiß nicht genau, auf was für einem System du da bist, denn das xargs von FreeBSD kennt die Option -i nicht. Außerdem verstehe ich deine Begründung für die Verwendung der -print0 Option nicht; _fu^r Adam.gif lässt sich auch prima ohne diese Option verarbeiten.

Willst du dass die Verzeichnisstruktur erhalten bleibt? Also bei deinem Beispiel:

/foo/bar/ordner 1/test1.gif
/foo/bar/ordner 2/unterordner1/test2.gif
/foo/bar/ordner_3/unterordner3/unterunterordner4/test3.gif

zu

/hugo/uga/ordner 1/test1.gif
/hugo/uga/ordner 2/unterordner1/test2.gif
/hugo/uga/ordner_3/unterordner3/unterunterordner4/test3.gif

oder alles in ein Verzeichnis:

/hugo/uga/test1.gif
/hugo/uga/test2.gif
/hugo/uga/test3.gif

Ich würd's so machen:

zweiter Fall:
Code:
find . -name "*.gif" -type f -exec mv "{}" /hugo/uga \;

Für den ersten Fall würde ich mir ein Skript basteln, das vorher das jeweilige Verzeichnis erstellt und dann verschiebt. Ansonsten könnte man auch die komplette Verzeichnisstruktur kopieren:

Code:
find . -type d -exec mkdir /hugo/uga/"{}" \;
find . -name "*.gif" -type f -exec mv "{}" /hugo/uga"{}" \;

Gruß Björn
 
Zuletzt bearbeitet:
bevor du dir irgendwas zerschiesst wuerde ich dir lieber zu so etwas hier raten:

Code:
% find * | grep -i  .gif$ >umbenenn.sh
alle gefundenen gifs schreibt der dann in die datei umbenenn.sh. dann startest du schnell vi
Code:
% vi umbennen.sh

und benutzt dort die kommandos:

Code:
:1,$s/^/mv "/g
:1,$s/$/" /g

jetzt musst du nur noch am ende jeder zeile eingeben wo die sachen hinsollen ;-)

aber dann reicht ein
Code:
% bash umbennen.sh
und die bilder laden da, wo sie hinsollen.
 
Jetzt kam mir der Geistesblitz weswegen du -print0 bei find verwenden wolltest. Da würde dann noch die Option -0 bei xargs notwendig sein.
 
Also so hier ginge das z.b. auch:

Verzeichnisse mit Bildern:
./o1/u1/a1/blah.gif
./o1/u1/a1/blah.jpg
./o2/u2/a2/blubb.gif
./o2/u2/a2/blubb.jpg

Zielverzeichnis:
./d/

Nun führe ich aus:
Code:
tar cpf - `find . -name "*.gif"` | tar xf - -C d/

Und d/ (das Ziel) schaut nun so aus:
Code:
scip@mutant: $ find d/
d/
d/o1
d/o1/u1
d/o1/u1/a1
d/o1/u1/a1/blah.gif
d/o2
d/o2/u2
d/o2/u2/a2
d/o2/u2/a2/blubb.gif

Wie man sieht, nur die .gif Dateien wurden bewegt, nebst Verzeichnisstruktur.



- scip
 
Danke erst mal

Hallo,

danke für die vielen Antworten aber das Problem ist bei mir folgendes:

Der Ordner /foo/bar/Odner 1/Ordner mit Leerzeichen/

enthält eben Leerzeichen die in der Linux/Unix Welt normalerweise so dargestellt werden

/foo/bar/Ordner\ 1/Ordner\ mit\ Leerzeichen/

dies können von mir unwissenden Knaben :grumble: leider nicht so in eine Pipe übergeben werden das er sie korrekt mit dem \ übergibt

also:

der befehl

find . -name "*.gif" -type f -exec mv "{}" /hugo/uga \;

oder

find . -type d -exec mkdir /hugo/uga/"{}" \;
find . -name "*.gif" -type f -exec mv "{}" /hugo/uga"{}" \;

sind super, aber ich bekomme immer ein "cannot stat"

das heißt wahrscheinlich das er den Ordner

/foo/bar/Odner 1/Ordner mit Leerzeichen/irgendwas.gif

wieder als

/hugo/uga/Odner 1/Ordner mit Leerzeichen/irgendwas.gif

was glaub ich nicht geht...

er soll den ordner so kopieren:

/hugo/uga/Odner\ 1/Ordner\ mit\ Leerzeichen/irgendwas.gif
 
Boah, warum verrennst du dich in eine find(1) Loesung, wenn das ganze mit tar(1) geradezu trivial zu erledigen ist?
Code:
cd /foo; tar cf - . | (cd /bar; tar xf - '*.gif')
 
Zurück
Oben