Wie kopiere ich versteckte Dateien und versteckte Unterverzeichnisse (die mit einem Punkt beginnen) in Ordner A in Ordner B? Wenn ich beispielsweise diese Struktur habe:
A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c
Ich möchte nur die versteckten Dateien und versteckten Unterverzeichnisse in A nach B kopieren:
B/.a
B/.b/
B/.b/somefile
B/.b/.c
Ich habe diesen Befehl bereits ausprobiert: cp A/.* B
fromdiese andere Superuser-Frage. Allerdings werden die Unterverzeichnisse nicht kopiert. Habe auch versucht cp -r A/.* B
, aber es kopiert, .
sodass ich am Ende eine exakte Kopie von A habe (einschließlich der normalen Dateien). Jede Hilfe ist willkommen.
Antwort1
Sofern Sie nur nach versteckten Dateien und Ordnern auf Ebene A suchen und beispielsweise nicht
A/b/.hidden
kopiert werden, sollten Sie Folgendes verwenden können:
cp -r A/.[^.]* B
Es bedeutet im Grunde, alles zu kopieren, was mit einem beginnt .
und dann ein beliebiges Zeichen außer .
einem .
...
Bearbeiten: Das -p wurde aus dem cp-Befehl entfernt, da der Fragesteller nicht angegeben hat, dass er irgendwelche Besitzverhältnisse, Daten usw. beibehalten möchte.
Antwort2
Das Problem dabei A/.*
ist, dass es ein Verzeichnis gibt .
, in A
dem das Muster ebenfalls übereinstimmt.
Sie können erweiterte Glob-Muster aktivieren und Folgendes verwenden:
shopt -s extglob
cp -r A/.!(?(.)) B
Es passt zu Dateien, deren Name mit einem Punkt beginnt und deren zweites Zeichen weder ein Punkt noch nichts ist ( ?(.) passt zu nichts oder einem Punkt, !(...) negiert es, d. h. !(?(.)) passt zu allem außer nichts oder einem Punkt).
Antwort3
Für solche Fälle würde ich empfehlen,find
anstattcp
so was:
find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
Die grundlegende Syntax lässt sich folgendermaßen zusammenfassen:
find A/ -type f
:find
Elemente im VerzeichnisA/
, deren Typ eine Datei ist (statt ein Verzeichnis) …-maxdepth 1 -name '.*'
: Dazu für einmaxdepth
Verzeichnis mit 1 und dessenname
Beginn mit.
.-exec cp -p {} B/ \;
: Und sobald diese Dateien gefunden wurden, führtexec
dercp
Befehl mit einem-p
Flag zum Beibehalten von Datum/Uhrzeit von der Quelle ({}
) zum Ziel ausB/
.
Ich verwende es gerne, maxdepth
um eine Kontrollebene hinzuzufügen, damit ich nicht versehentlich ein ganzes Dateisystem kopiere. Sie können es aber auch gerne entfernen.
Antwort4
Alternativ können Sie diesen anderen Befehl verwenden, wenn das zweite Zeichen alphanumerisch ist (Quelle):
cp -r A/.[a-zA-Z0-9]* B