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:
-Hwirdfindverursachen 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 1stopptfindrekursiv in alle Verzeichnisse absteigen, deren Name mit einem Punkt beginnt. Wir brauchen es nicht, um zu rekursieren,cpwird das für uns erledigen, wir brauchen nur die Namen auf dieser Ebene.-name '.*'sagtfinddass wir alle Namen wollen, die mit einem Punkt beginnen. Dies funktioniert nicht korrekt, wenn die UmgebungsvariablePOSIXLY_CORRECTeingestellt 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 lsind drei Bedingungen mit einem oder zwischen ihnen.-type dstimmt mit Verzeichnissen überein,-type fentspricht regulären Dateien und-type lentspricht Symlinks. Sie können auswählen, was Sie möchten – wenn Sie beispielsweise keine Einstellungsverzeichnisse sichern möchten, lassen Sie-type dweg (und die-odirekt dahinter, offensichtlich.)-exec ..... \;sagtfindjedes 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.