Lösung 1:
Fast jedes Mal kann dies einfach mit gelöst werden:
cp -R .[a-zA-Z0-9]* directory
Es ist ziemlich ungewöhnlich, eine versteckte Datei zu haben, die nicht mit einem dieser Zeichen beginnt.
Andere Musterübereinstimmungen sind verfügbar (.??*
, .[^.]*
) - siehe Kommentare
Lösung 2:
Mein Favorit beim Verschieben von Verzeichnissen im Allgemeinen war:
tar cvf - . | (cd /dest/dir; tar xvf -)
Dadurch wird das aktuelle Verzeichnis nach stdout tariert und dann an eine Subshell weitergeleitet, die zuerst CDs in das Zielverzeichnis überträgt, bevor stdin entpackt wird. Einfach, direkt, erweiterbar – überlegen Sie, was passiert, wenn Sie () durch ein ssh zu einem anderen Rechner ersetzen. Oder um Ihre Frage zu beantworten:
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
Lösung 3:
Sie könnten rsync
verwenden .
rsync -a ./ /some/other/directory/
das den Inhalt des aktuellen Verzeichnisses kopiert (einschließlich Punktdateien, aber nicht einschließlich ..
)
Lösung 4:
Ich flehe Sie an, entfernen Sie sich von der einfachen Shell-Erweiterung auf der cp
Befehlszeile - Shell-Erweiterung hat alle möglichen ahem "interessante" Eckfälle (unerwünschte Rekursion verursacht durch . und .., Leerzeichen, nicht druckbares Zeug, Hardlinks, symbolische Links und so weiter.) Verwenden Sie find
stattdessen (kommt in findutils
Paket, falls Sie es nicht installiert haben - was seltsam wäre, alle Distributionen installieren es standardmäßig):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
Schritt-für-Schritt-Erklärung:
-H
wirdfind
verursachen keinen symbolischen Links zu folgen (außer wenn der eigentliche Verzeichnisname der obersten Ebene, den Sie ihm gegeben haben, ein symbolischer Link ist; dem wird er folgen.)/path/to/toplevel/dir/
soll natürlich von Ihnen durch den Pfad des Verzeichnisses ersetzt werden, in dem sich die Einstellungsdateien und Verzeichnisse befinden, die Sie sichern möchten.-maxdepth 1
stopptfind
rekursiv in alle Verzeichnisse absteigen, deren Name mit einem Punkt beginnt. Wir brauchen es nicht, um zu rekursieren,cp
wird das für uns erledigen, wir brauchen nur die Namen auf dieser Ebene.-name '.*'
sagtfind
dass wir alle Namen wollen, die mit einem Punkt beginnen. Dies funktioniert nicht korrekt, wenn die UmgebungsvariablePOSIXLY_CORRECT
eingestellt ist, aber selten (wenn überhaupt). Dies ist die erste Übereinstimmungsbedingung, die wir bisher angegeben haben.a \( ....... \)
ist ein und gefolgt von einer komplexeren Bedingung in Klammern (ich habe ..... verwendet, um sie zu ersetzen, sie wird unten erklärt.) Wir müssen die Klammern maskieren, da sie sonst von der Shell (falsch) interpretiert werden, daher der umgekehrte Schrägstrich vor ihnen,-type d -o -type f -o -type l
sind drei Bedingungen mit einem oder zwischen ihnen.-type d
stimmt mit Verzeichnissen überein,-type f
entspricht regulären Dateien und-type l
entspricht Symlinks. Sie können auswählen, was Sie möchten – wenn Sie beispielsweise keine Einstellungsverzeichnisse sichern möchten, lassen Sie-type d
weg (und die-o
direkt dahinter, offensichtlich.)-exec ..... \;
sagtfind
jedes Mal, wenn eine Übereinstimmung gefunden wird, einen Befehl auszuführen. Das Ende des Befehls wird durch ein Semikolon markiert, dem wir wiederum mit einem Backslash vorangehen müssen, um eine Shell-Interpretation zu vermeiden. Innerhalb dieser Befehlszeile müssen Sie{}
verwenden wo der Name der aktuell gefundenen Übereinstimmung enden soll. Da Shells auch die geschweiften Klammern falsch interpretieren könnten, sollten Sie sie in Apostrophe setzen, wie in'{}'
. Der Befehl, den wir in diesem Fall ausführen möchten, istcp -a '{}' /path/to/destination/dir/
(-a bedeutet Archiv, das sich in Unterverzeichnissen wiederholt, symbolische Links als Links kopiert und Berechtigungen und erweiterte Attribute beibehält, und/path/to/destination/dir/
ist offensichtlich der Name des Zielverzeichnisses - ersetzen Sie es.)
Also, im Klartext, diese find
Befehlszeile sagt Folgendes:
Beginnen Sie bei /path/to/toplevel/dir/. Steigen Sie nicht in Unterverzeichnisse ab. Finden Sie alle Verzeichnisse, Dateien und Symlinks, deren Name mit einem Punkt beginnt. Kopieren Sie es für jedes von Ihnen gefundene nach /path/to/destination/dir/ und bewahren Sie Natur, Berechtigungen und erweiterte Attribute.
Lösung 5:
Ich habe immer .??* verwendet, um versteckte Dateien zu finden, ohne "." und "..". Es könnte jedoch ".a" oder so etwas fehlen, aber ich habe nie eines davon.