Solange Sie nur nach versteckten Dateien und Ordnern auf der Ebene A suchen und zum Beispiel nicht wollen
A/b/.hidden
zu kopieren, 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 .
Das filtert .
heraus und ..
Bearbeiten:Das -p aus dem cp-Befehl entfernt, da Asker nicht angegeben hat, dass er Eigentumsrechte, Daten usw. beibehalten möchte.
Das Problem mit A/.*
ist, dass es das Verzeichnis .
gibt in A
was auch zum Muster passt.
Sie können erweiterte Glob-Muster aktivieren und Folgendes verwenden:
shopt -s extglob
cp -r A/.!(?(.)) B
Es passt auf Dateien, deren Name mit einem Punkt beginnt und deren zweites Zeichen weder ein Punkt noch nichts ist (?(.) passt auf nichts oder einen Punkt, !(...) negiert es, d.h. !(?(.)) passt auf alles andere als nichts oder ein Punkt).
Für solche Fälle würde ich die Verwendung von find
empfehlen statt cp
so:
find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
Die grundlegende Syntax gliedert sich wie folgt:
find A/ -type f
:find
Einträge im VerzeichnisA/
dessen Typ eine Datei (anstelle eines Verzeichnisses) ist…-maxdepth 1 -name '.*'
:Dazu für einmaxdepth
von 1 Verzeichnissen und derenname
beginnt mit.
.-exec cp -p {} B/ \;
:Und sobald diese Dateien gefunden wurden,exec
diecp
Befehl mit einem-p
Flag, um Daten/Zeiten aus der Quelle beizubehalten ({}
) zum Ziel vonB/
.
Ich verwende gerne maxdepth
um eine Kontrollebene hinzuzufügen, damit ich nicht versehentlich ein ganzes Dateisystem kopiere. Aber Sie können das gerne entfernen.