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

nur versteckte Dateien aus Ordner mit cp kopieren?

montio

Newbie
Hallo,
ich möchte in einem Skript alle versteckten Dateien aus dem Homeverzeichnis kopieren.
Mein Versuch mit
cp -rpv /home/mw/.* /media/usbdisk/test2
hat zwar gut begonnen, jedoch auch irgendwann das auf /home/mw/f gemountete Netzlaufwerk mitgesichert, was nicht gehen sollte.

Meine Suchen im Internet sind leider erfolglos geblieben.

Wenn es mit den versteckten Dateien einen Tipp gibt, dann wäre mir schon mal sehr geholfen.

Wenn es dann noch einen weiteren Trick gibt, mit dem ich z. B. das Verzeichnis /home/mw/.vmware ausklammern könnte, wäre das die Krönung, aber wenn mir jemand mit dem ersten Teil des Postings helfen könnte wäre ich schon sehr dankbar.

Vielen Dank an Euch.

Gruß, montio
 
A

Anonymous

Gast
du hast einen syntax-fehler drin, wenn ein .* funktionieren würde, dann wär alles viel einfacher. Zumindest geht es mit grep nicht. Und ausserdem hast du ein "recursive" mit drin, das kopiert das aktuelle verzeichnis UND ALLE UNTERVERZEICHNISSE, man müsste ein script bauen, das erstmal die versteckten dateien rausfiltert, das würde dann zb so gehen:
Code:
nicht_versteckt=$(ls -A | cut -d "." -f1 | tr -d " ")
versteckt=$(ls -A | grep -v $nicht_versteckt)
Jetzt kannst du in dem script alle versteckten dateien über $versteckt aufrufen...
Und das vmware kannst du mit grep -v ausschliessen, wie du siehst, benutze ich das auch, um die NICHT versteckten dateien auszuschliessen
 
OP
M

montio

Newbie
hallo rm -rf,

vielen Dank für den Tipp. Ich bin (leider) noch nicht so tief in Linux drin, als dass ich auf solche Ideen käme. Auch muss ich leider zugestehen, dass ich insbesondere die erste Zeile noch nicht ganz verstehe. Werde mir sie aber zu Gemüte führen, damit ich was dazu lerne. Melde mich, sobald ich weiter gemacht habe.

Gruß, montio
 

TeXpert

Guru
selbstverständlich kann man auch nur die Dot-Files bekommen, das Problem ist, dass bei ".*" bereits der Punkt als Wildcard verwendet wird, d.h. den muss man escapen.

also ein
Code:
ls -ld \.*
zeigt alle versteckten Dateien und Verzeichnisse an.

beim Kopieren müssen wir allerdings noch etwas mehr tricksen ;)

Problem:
Code:
\.*
matched leider auf
Code:
..
und damit würde ein cp -r in der Hierarchie auch nach oben gehen, d.h. wir wollen nur die Einträge, die als erstes einen Punkt und als 2. keinen Punkt haben und dann beliebige Zeichen:

Code:
cp -rpv /home/mw/\.[^\.]* /media/usbdisk/test2


HTH[/code]
 
OP
M

montio

Newbie
Hallo TeXpert,

tausend Dank für Deine Antwort und die gesamte Herleitung/Erklärung. Ich habe es (glaube ich) soweit verstanden und finde den Ansatz logischer, als die Variante mit grep.

Jetzt bleibt für mich nur noch offen, wie ich auch .vmware ausklammern kann.

Geht das vielleicht mit
cp -rpv /home/mw/\.[^\. ^\.vmware]* /media/usbdisk/test2

Oder müsste man als Trennzeichen statt Leerstelle ein Semikolon nehmen?

Hast Du (oder irgendwer anders) damit schon Erfahrungen?

Nochmals vielen tausend Dank für Deine Antwort und noch ein schönes Restwochenende. Gruß, montio[/quote]
 

TeXpert

Guru
nein das geht nicht, das Problem ist, dass Bash keine richtigen Regular Expressions unterstützt, man kann nur das Globbing etwas tweaken.

in diesen Fällen muss man anders vorgehen, dazu jetzt noch eine Detailfrage:

umwelche Dateien geht es genau:

seien in Home:

.a
.b
.c

alles Dateien,

.x
.y
.z

alles Verzeichnisse und dann

.x/a
.x/b
.x/.u
.x/.v

Dateien in den Verzeichnissen -> welche sollen im Ergebnis alle Kopiert werden? auch .x/a und .x/b oder nur die .x/.u und .x/.v ? dann auch nur die dot-Dateien oder nur die .verzeichnisse...
 
A

Anonymous

Gast
ich verstehs nich.... wie kann man ein "cp -rpv /home/mw/\.[^\.]* /media/usbdisk/test2 " weniger kryptisch und logischer finden als die 2 simplen shell-zeilen von mir? Kapier ich ned... Normalerweise sollte man doch davon ausgehen, dass mehrere, zuallererst mal unübersichtlich angeordnete sonderzeichen schwieriger zu verstehen sind, als ein paar aneinandergereihte befehle, die jeweils eine eigene, klar definierte funktion haben, oder?
 
OP
M

montio

Newbie
TeXpert schrieb:
umwelche Dateien geht es genau:

Es sollen alle Dateien und fast alle Verzeichnisse aus Home kopiert werden. Bei den zu kopierenden Verzeichnissen sollen alle enthaltenen Datein (versteckt und nicht versteckt) und alle Verzeichnisse (versteckt und nicht versteckt) kopiert werden.
Jedoch soll das .vmware Verzeichnis (und ein weiteres verstecktes privates Verzeichnis) in Home nicht kopiert werden (wegen der Größe).

Ich habe mir ein kleines Skript gemacht, dass im ersten Schritt die versteckten Dateien kopieren sollte und im zweiten SChritt dann die "normalen" Verzeichnisse.

Hilft das weiter?
Ich werde mir aber noch einmal den Weg von rm -rf ansehen.

Gruß, montio
 

TeXpert

Guru
rm -rf / schrieb:
ich verstehs nich.... wie kann man ein "cp -rpv /home/mw/\.[^\.]* /media/usbdisk/test2 " weniger kryptisch und logischer finden als die 2 simplen shell-zeilen von mir?

<Scherz>vielleicht weil Dir von Dir kommen ;) </Scherz> nein, ernsthaft, ich denke die Idee ist deshalb angenehmer, da es sich um einen Befehl handelt und man das mit einem Aufwasch erschlagen kann.

montio schrieb:
Es sollen alle Dateien und fast alle Verzeichnisse aus Home kopiert werden. Bei den zu kopierenden Verzeichnissen sollen alle enthaltenen Datein (versteckt und nicht versteckt) und alle Verzeichnisse (versteckt und nicht versteckt) kopiert werden.
Jedoch soll das .vmware Verzeichnis (und ein weiteres verstecktes privates Verzeichnis) in Home nicht kopiert werden (wegen der Größe).

ok, dann müssen wir einen kleinen Klimmzug machen ;)

1. Schritt alle Dateien und Verzeichnisse im Home-Dir auswählen,
2. Schritt diese ins Ziel kopieren

Wie?
1. Schritt: Suchen und finden --> find
2. Schritt: Auf den gesuchten ausführen --> exec


Code:
find /tmp/foo/ -name "\.[^\.]*" \! -name ".vmware" -maxdepth 1 -exec cp -rpv {} /tmp/foo2 \;
 
OP
M

montio

Newbie
Hallo TeXpert,

ich habe Deine Zeile gerade testhalber ausprobiert und es sieht so aus, dass ich am Ziel bin.
Ich musste lediglich die Anführungszeichen bei ".vmware" wegnehmen.

Dir und auch rm -rf sehr herzlichen Dank für Eure Hilfe, Erklärungen und Geduld mit mir.

Schade, dass ich mich vermutlich nie bei Euch revanchieren kann, da ich nie an Euer Wissen herankommen werde!!

Gibt es vielleicht auch so eine Lösung für nur die sichtbaren Dateien?
Also alle sichtbaren Dateien und Verzeichnisse aus /home/mw/ bis auf /home/mw/tmp/
Meine Versuche mit find haben immer dazu geführt, dass zwar die richtigen (sichtbaren) Verzeichnisse kopiert wurden, jedoch zusätzlich in einem Ordner noch einmal das gesamte Verzeichnis (also alles doppel + zusätzlich die versteckten Verzeichnisse)

Gruß, montio
 

TeXpert

Guru
hmm,
lediglich die Anführungszeichen bei ".vmware" wegnehmen
seltsam.... an sich nicht


das andere ist auch möglich ;) versuch mit der manpage find zu verstehen und zeig Deine Versuche her... (Hint: wenn Du Deinen Aufruf erklären kannst, ist Dir auch klar warum er etwas macht)
 
OP
M

montio

Newbie
Hallo TeXpert,

ich habe jetzt 2 Stunden rumprobiert und komme immer wieder auf das gleiche Problem

find /tmp/foo/ -not -name "\.*" -not -name tmp -maxdepth 1 -exec cp -rpv {} /tmp/foo2 \;


Erklärung:
find soll in /tmp/foo alle Dateien finden, die aber nicht mit einem Punkt beginnen dürfen (-not -name "\.*") und dann soll noch das tmp-Verzeichnis ausgeklammert werden (-not -name tmp). Rekursive Tiefe ist 1, also nur was in /tmp/foo steht und dann den cp-Befehl ausführen.

Soweit funktioniert auch alles.
Allerdings legt er auch immer noch eine Kopie des kompletten /tmp/foo Verzeichnisses einschließlich aller Unterverzeichnisse/-dateien an. Und hier drehe ich mich im Kreis.

Du hattest erklärt, dass der ".."-Eintrag dazu führt, dass er auch das übergeordnete Verzeichnis mit einschließt. Aber weil er doch alle Dateien, die mit einem Punkt anfangen nicht mitnimmt, dürfte das doch gar nicht eintreten.

Kannst Du mir noch einen kleinen Tipp geben?

Gruß, montio
 

TeXpert

Guru
ok, jetzt erst noch mal einen Gang zurück ;)
Code:
find /tmp/foo/ -name "\.[^\.]*" \! -name ".vmware" -maxdepth 1 -exec cp -rpv {} /tmp/foo2 \;
das hatte ich so spontan aus dem vorhandenen zusammengehauen, aber das ist ja völlig zu viel ;) die Punkte müssen in den Strings nicht escaped werden und da find mit Verzeichnissen umgehen kann und die Rekursion selber macht wird auch .. nicht gefunden, also reicht das hier aus:

Code:
find /tmp/foo/ -name ".*" \! -name ".vmware" -maxdepth 1 -exec cp -rpv {} /tmp/foo2 \;

so und analog bauen wir jetzt die andere Form zusammen:

finde alle Einträge
Code:
find /tmp/foo/
ohne Punkt:
Code:
\! -name ".*"
nicht mit Namen tmp:
Code:
\! -name "tmp"
und kopiere die:
Code:
-exec cp -rvp {} DEST \;

ups und es passiert, also schauen wir uns die gefundenen Dateien mal an:
Code:
find /tmp/foo/ \! -name ".*"  \! -name "tmp" -print
die erste Zeile ist ein : /tmp/foo/ hmmm, klar, ein leerer Dateiname fängt auch nicht mit Punkt an und ist nicht tmp -> match, blöd. aber wir wissen (zumindest bin ich jetzt der Meinung ;) ) dass das der einzige Eintrag ist, der auf "*/" matched -> also einfach noch ein
Code:
\! -name "*/"
einbauen und
Code:
find /tmp/foo/ \! -name ".*"  \! -name "tmp" \! -name "*/" -exec cp -rvp {} DEST \;
müsste sein was Du suchst ...
 
OP
M

montio

Newbie
Vielen tausend Dank TeXpert,

so funktioniert es. Lediglich noch ein "-maxdepth 1" ergänzt.

Allerdings verstehe ich nicht ganz, was dieses */ bewirkt.

* steht für irgendwelche Zeichen und / wohl für ein Verzeichnis.

Ist */ so ein regulärer Ausdruck für leere Verzeichnisse?

Noch einmal vielen, vielen Dank und eine gute Nacht.

Gruß, Martin

P.S.: Noch zwei kleine Fragen: sollte ich statt -rpv beim cp-Befehl lieber -dpRv bzw. -av nehmen, um die Dateien möglichst Original (mit Datum, Benuztern, Rechten ...) zu übernehmen? Und gibt es einen Unterschied zwischen -R und -r? Manchmal findet man, dass es egal ist und manchmal soll -R für Verzeichnisse und -r für Dateien stehen?
 

TeXpert

Guru
montio schrieb:
Vielen tausend Dank TeXpert,

so funktioniert es. Lediglich noch ein "-maxdepth 1" ergänzt.
stimmt, gut aufgepasst :)
für die Boardsuche:
Code:
find /tmp/foo/ \! -name ".*"  \! -name "tmp" \! -name "*/" -maxdepth 1 -exec cp -rvp {} DEST \;

wobei hier natürlich wichtig ist, dass das Suchverzeichnis mit /tmp/foo/ aufgerufen wird... bei einem Verzeichnis /tmp/foo matched der Leere Eintrag auf /tmp/foo und der Trick mit dem */ klappt nicht.


Allerdings verstehe ich nicht ganz, was dieses */ bewirkt.
* steht für irgendwelche Zeichen und / wohl für ein Verzeichnis.

Ist */ so ein regulärer Ausdruck für leere Verzeichnisse?
nein, wir arbeiten hier leider gar nicht mit regulären Ausdrücken :( auch die ersten cp-Schritte arbeiteten nicht mit Regulären Ausdrücken sondern mit Globbing (also >>Dateiaufsammel<<) Ausdrücken... aber nachdem ich eine Nacht drüber geschlafen habe ;) das müsste auch mit regulären Ausdrücken gehen, find kennt schließlich -regex, da werde ich nach meinem ersten Kaffee noch mal drüber nachdenken.

Jetzt zum "*/", Globbing ist teilweise ähnlich zu regulären Ausdrücken aber nicht so mächtig, ein * ist einfach alles, durch nicht Wildcards kann ich bestimmte Fixpunkte setzen, hierzu muss man sich die reinen Ergebnisse ansehen und überlegen, mit welchen Fixpunkten kann ich das erreichen was ich will, hier passt das ganz gut, dass es nur einen EIntrag mit / am Ende gibt.

Noch einmal vielen, vielen Dank und eine gute Nacht.
hatte ich ;) solche Herrausforderungen liebe ich... das ist nicht mit einem RTFM zu erschlagen, da muss man schon mal ein paar Minuten drüber nachdenken... deshalb treib ich mich hier rum...

P.S.: Noch zwei kleine Fragen: sollte ich statt -rpv beim cp-Befehl lieber -dpRv bzw. -av nehmen, um die Dateien möglichst Original (mit Datum, Benuztern, Rechten ...) zu übernehmen? Und gibt es einen Unterschied zwischen -R und -r? Manchmal findet man, dass es egal ist und manchmal soll -R für Verzeichnisse und -r für Dateien stehen?

manchmal findet man ist völlig egal ;) die einzige Autorität ist in dem Fall die manpage und da steht:

Code:
-R, -r, --recursive
              copy directories recursively
also gleichwertig. die Frage ob rpv oder dpRv sollte Dir ein Blick in die Manpage erklären ;)

av und dpRv sind äquivalent, mit dem preserven von Links hmmm da bin jetzt unsicher und auch das texinfo dokument ist spontan nicht eindeutig...
 
OP
M

montio

Newbie
Hallo TeXpert,

bzgl. der regulären Ausdrücke brauchst Du Dir wegen mir keine Gedanken zu machen. Ich bin super glücklich über das, was Du für mich entwickelt hast.

Und mit dem copy-Befehl werde ich das -d wohl noch einbauen (bzw. das -a). Klingt sinnvoller.

Nochmal tausend Dank. So jemanden wie Dich hätte ich gerne mal 1-2 Tage neben mir sitzen und viele meiner Probleme wären ruck zuck verflogen, ohne dass ich tagelang im Internet suchen und probieren müsste. Hab leider noch niemanden in meiner Umgebung gefunden. Daher bin ich umso glücklicher, dass es diese Forum gibt und insbesonde solche Leute wie Dich.

Gruß montio
 
A

Anonymous

Gast
montio schrieb:
Nochmal tausend Dank. So jemanden wie Dich hätte ich gerne mal 1-2 Tage neben mir sitzen und viele meiner Probleme wären ruck zuck verflogen,
ähm...nö. So jemand hilft dir rein garnicht, weil er zwar einiges erklären kann, aber nach ner zeit eben nicht mehr, weil er entweder keine lust mehr hat "babysitter" zu spielen, oder weil er nicht genug UNwissen besitzt, um es jemanden erklären, der die grundsätze nicht beherrscht... Is so ähnlich wie einem Hauptschüler höhere Physik erklären zu wollen, da sind die Differenzen so gross, dass man schon garnicht mehr gescheit erklären kann. Glaub mir, ich hab grad so nen Kunden, dem muss man alles bis auf den Ursprung erklären, weil mal so rein garnichts an Wissen da is --> Das is fast unmöglich.
montio schrieb:
ohne dass ich tagelang im Internet suchen und probieren müsste.
musst du sowieso, egal wer dir wieviel erklärt. Linux ist primär ein Betriebssystem für Entwickler und Geeks. Es ist zudem ein sehr komplexes OS, welches niemals Fehler bietet, die überall gleich sind. Es kann durchaus mal vorkommen, dass du einen Fehler produzierst, den noch nie ein Mensch vor dir hatte (nicht in dieser speziellen Konstellation). Ganz anders bei Windows: Dort sind 90% der Fehler bekannt, und können meisstens auch leicht behoben werden. Allein schon deswegen MUSS man öfters mal selbst Hand anlegen, suchen, testen, scripten, wieder testen, wieder suchen etc. etc.....(unter Linux mein ich jetz)
Ergo: Du willst Linux benutzen? Dann gewöhn dich schonmal an den Geschmack von Kaffee, dicke Aufenringe, Schlaflosigkeit und eine steigende Empfindlichkeit gegenüber Sonnenlicht :lol: :lol:
 

TeXpert

Guru
montio schrieb:
Nochmal tausend Dank. So jemanden wie Dich hätte ich gerne mal 1-2 Tage neben mir sitzen und viele meiner Probleme wären ruck zuck verflogen, ohne dass ich tagelang im Internet suchen und probieren müsste. Hab leider noch niemanden in meiner Umgebung gefunden. Daher bin ich umso glücklicher, dass es diese Forum gibt und insbesonde solche Leute wie Dich.

Freu Dich nicht zu früh, ich helfe so ausführlich nur dann wenn mich das Problem reizt oder (bei einer Gewichtung mit und wäre es wohl 40:60 oder:und jeweils rein Aussagenlogisch gesehen) wenn ich sehe, dass zumindest etwas Eigenleistung da ist ;) je mehr Eigenleistung desto weniger muss mich das Problem reizen...

Leute die _nicht_ im Internet suchen wollen fahren bei mir _sehr_ schnell an die Wand... ich glaube auch nicht, dass ich Dir noch mal bei einem find Problem auf dem gleichen Niveau in der Form helfen würde ;) zumindest nicht ohne eigene Transferleistung auf die neue Form....

diese Regex-Geschichte ist so ein Beispiel, das ist ein Gedankenexperiment für mich ;) ich denke darüber nach, weil ich das für mich als Herausforderung sehe nicht weil Du es gebrauchen könntest... wenn es nur um eine Hilfestellung geht, reicht mir auch der erste Weg ;)
 
OP
M

montio

Newbie
Guten Morgen TeXpert und rm -rf,

ich wollte keine irgendwie geartete Diskussion entfachen, sondern Euch einfach nur Danke sagen und daher gehe ich auf Eure Reaktionen jetzt nicht weiter ein (wäre wohl auch das falsche Forum).

Warum auch immer Ihr mir und anderen helft oder geholfen habt, nochmals vielen Dank.

montio
 
Auch wenn ihr schon eine Lösung habt, meine Empfehlung wäre:


tar cf - ./ | ( cd /media/usbdisk/test2 && tar tvpf - --exclude ./.vmware "./.*" )

Der Befehl oben macht nur eine Anzeige war kopiert würde, wenn "tvpf" durch
"xvpf" ersetzt würde Dann macht tar die Arbeit für euch.

"Suboptimal" ./ schickt auch die normalen Dateien auf die Reise. Könnte man durch "./.[^.]*" optimieren.

( cd ... && <tar> ) sorgt dafür <tar> im Zielverzeichnis aufgerufen wird und
nicht ausgeführt wird, wenn der "cd ..." fehlschlägt.
Also sollte auch möglich sen :
tar cf - --exclude ./.vmware ./.[^.]* | ( cd /media/usbdisk/test2 && tar tvpf - )

Mein Lieblingsbefehl um zu sehen was die Shell aus Parametern macht ist "echo"
Also z.B. echo ./.[^.]* um zu sehen was "tar" oder "cp" eigentlich als Aufruf bekommen.
Versuche mal "echo tar cf - --exclude ./.vmware ./.[^.]*"

Auch ein Vorteil von dieser "tar" Konstruktion, sie lässt sich zum Kopieren auf andere
Rechner nutzen:
tar cf - --exclude ./.vmware ./.[^.]* | ssh -l andereruser andererrechner "( cd /media/usbdisk/test2 && tar tvpf - )"




Viele Grüße

Haveaniceday

PS: Ein wichtiger Unterschied zwischen "Win"-Dosenfenstern und UNIX-Shells
Unter UNIX macht die Shell das expandieren. Dadurch ist die Nutzung und die
Übergabe der Parameter an das Programm einheitlich.
In z.B. Aufrufen in "DOSEN"-Fenstern ist das auswertende Programm für das
expandieren der Parameter zuständig. Und damit stärker von der Intelligenz
des Programmieres ;-)
 
Oben