Bestimmte Dateien kopieren
-
nman schrieb:
...ich hasse diese Oldschool-Unix-Tools.
Ich nicht. Häufig ist das leider der kleinste gemeinsame Nenner, wenn man (so wie ich) gezwungen bzw. gewillt ist, auf diversen Unix-Derivaten zu arbeiten und kompatible Scripts zu entwickeln.
nman schrieb:
Das hat nichts mit grep zu tun, viele Tools können einfach mit nicht maskierten Sonderzeichen (zB Whitespaces) im Dateinamen nicht umgehen, wie sie find naturgemäß ausspuckt.
~ % touch loesch\ mich\ bitte ~ % find . -iname 'loesch mich bitte' ./loesch mich bitte ~ % find . -name 'loesch mich bitte' -print ./loesch mich bitte
... nur so, das Beispiel habe ich verstanden. Auch wenn irgendwelche Tools ggf. nicht mehr mitspielen, ist zumindest das ein guter Grund, diese Files zu eliminieren. Dateinamen mit irgendwelchen Sonderzeichen (inkl. Blanks) haben m.E. auch einem validen Unix-System nichts zu suchen und keine Daseinsberechtigung (und das ist meine subjektive Meinung ;-). Denn der nächste Fehler kommt durch solche Files bestimmt....
So, und jetzt können wir gerne die theoretische Diskussion beenden, denn das hat - mal wieder - mit der ursprünglichen Fragestellung nichts zu tun und abschweifende Expertendiskussionen sind zwar recht häufig interessant, aber verwirren den Fragesteller höchstens.
-
jox schrieb:
nman schrieb:
...ich hasse diese Oldschool-Unix-Tools.
Ich nicht. Häufig ist das leider der kleinste gemeinsame Nenner
Das "leider" schreit förmlich "Ich auch". :p
Dateinamen mit irgendwelchen Sonderzeichen (inkl. Blanks) haben m.E. auch einem validen Unix-System nichts zu suchen und keine Daseinsberechtigung (und das ist meine subjektive Meinung ;-).
Egal, wie Du Deine Dateien benennst: Sonderzeichen und Spaces im Dateinamen sind - glücklicherweise - erlaubt und daher musst Du beim Entwickeln Deiner Software darauf Rücksicht nehmen.
...aber verwirren den Fragesteller höchstens.
Stimmt. Daher nochmal an den OP:
Folgende Lösung von jox funktioniert und ist die brauchbarste genannte:
find /path/to/source -name '*.[hc]' -print | cpio -pdvm /path/to/target
-
Hi,
geht das hier auch, oder muss man da noch was in " einschließen?find /path/to/source -name '*.[hc]' -exec cp '{}' /path/to/dest/`dirname '{}'`/ \;
Ist doch etwas kriptischer gewurden als gedacht :p
MfG
AlexanderS
-
AlexanderS schrieb:
geht das hier auch, oder muss man da noch was in " einschließen?
find /path/to/source -name '*.[hc]' -exec cp '{}' /path/to/dest/`dirname '{}'`/ \;
Was ist der Hintergrund Deiner Frage? Hat was nicht richtig geklappt????
Sonst aber schon korrekt verstanden, im Prinzip so ähnlich (ungetestet):
find /path/to/source -name '*.[hc]' -exec cp -p {} /path/to/dest/`dirname {}` \;
- aber mit der Option -p beim copy-Kommando, damit eine nicht existierende Zieldirectory angelegt wird
- ggf. muss man bei der Selektion mittels -name die Kriterien so einschränken, dass nur wirkliche .h und .c Files ausgesucht werden. Ich bin mir nicht sicher, ob z.B. der Punkt mit einem Backslash als Escape-Character versehen werden muss, also z.B. -name '*\.[hc]' ,i.d.R muss das ausprobiert werden, vielleicht auch 2 oder 3 Backslash-Zeichen (das ist auch systemabhängig=> Sonst findet vielleicht das find-Kommando auch eine Directory mit der Endung "h" oder "c", damit kommt dann vermutlich das copy-Kommando nicht zurecht.
- wann das Kommando "dirname" interpretiert wird, ist auch fraglich. Ich schätze mal, sofort, also nicht beim Ausführen des exec-Kommandos. D.h., auch hier sind ein od. mehrere Backslash-Zeichen notwendig (habe grad kein Unix-System am Laufen zum Austesten)Falls man das Kommando irgendwann zum Laufen bekommt, sieht man aber zwei entscheidende Nachteile:
(1) Es erfolgt keine Ausgabe der kopierten Dateien (wie z.B. bei "find ... | cpio ... "), naja, das bekommt man noch mit der Option -v beim "cp" hin.
(2) Das Konstrukt braucht einfach bei vielen Dateien ziemlich lange, weil für jede Datei das Kommando "cp" erneut gestartet wird. Bei 100 gefundenen Files werden man so locker 201 Prozesse gestartet (1 find, 100 cp, 100 dirname), beim "find ... | cpio ..." gibts nur 2 Prozesse.Fazit:
Das gute alte "find ... | cpio ... " ist die adäquate Lösung für das Problem.P.S.: Im Prinzip kann man es auch noch mit einem "tar" hinbekommen, aber das ist eine noch ältere Variante und etwas schwieriger hinzubekommen. (Hab' ich aber auch schon mal gemacht, weil das andere in irgendeinem Zusammenhang nicht klappte). Die "tar" Variante ist nicht wirklich besser und in diesem Zusammenhang höchstens als Denksportaufgabe zu betrachten
P.P.S.: Ach so, die Option "-follow" beim find-Kommando ist sehr nützlich, wenn auch symbolische Subdirectory-Links durchforstet werden sollen.
-
Was habt ihr eigentlich alle gegen die exec-Syntax? Ich benutze die fast täglich, und habe mir sogar (u.a.) für find extra Cygwin auf die XP-Büchse installiert.
-
LordJaxom schrieb:
Was habt ihr eigentlich alle gegen die exec-Syntax? Ich benutze die fast täglich, und habe mir sogar (u.a.) für find extra Cygwin auf die XP-Büchse installiert.
Nix. Ich bin der Meinung, soll doch jeder das benutzen, was er will und wo er besser mit zurechtkommt.
Gegenfrage: Was habt ihr eigentlich alle gegen das "cpio"?
-
Vielen Dank Euch allen,
hab jetzt nur
find /path/to/source -name '*.[hc]' -print | cpio -pdvm /path/to/target
probiert; klappt einwandfrei. Kann mir noch jemans sagen, was die Optionen
pdvm
machen? Die man-Seite von cpio ist nicht sehr aussagekräftig
Ansonsten: Vielen Herzlichen Dank!!!
Gruß, Luutsch
-
Bei vielen GNU-Tools ist die Info-Seite lesbarer. Oder Du probierst die BSD-Seite zu cpio: man: cpio
-
cpio --help|less
ist überhaupt nicht "helpless":) .
Die Man-page von cpio unter Linux ist wirklich nicht so informativ. Aber eine Zeile ist doch hilfreich:
info cpio
Solltest Du auch mal ausprobieren
Tntnet
-
luutsch schrieb:
Kann mir noch jemans sagen, was die Optionen
pdvm
machen? Die man-Seite von cpio ist nicht sehr aussagekräftigauf eine einfache Frage eine einfache Antwort:
p - (pipe): cpio übernimmt die Liste der zu kopierenden Dateien über den pipe-Operator, also genau das was man mit "find /srcdir -print | cpio -pdvm ..." macht; alternativ geht z.B. auch "ls /srcdir | cpio -pdvm ...", oder man erstellt sich eine Liste von Dateinamen in einer Datei dateixyz und macht dann "cat dateixyz | cpio -pdvm ..."
d - (directory): cpio richtet Directories und Subdirectories ein, macht also implizit ein mkdir
v - (verbose): die Operationen werden protokolliert
m - (modification-time): Bei der Neuanlage der Ziel-Dateien wird die Modification-Time der Datei aufrechterhalten, d.h. das Datum der Quell-Datei wird übernommen, ohne die Option "-m" wird das aktuelle Datum als Anlagedatum genommen.
... und auch von mir eine gute URL für manual pages:
http://www.linuxmanpages.com