GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Versteckte Dateien rekursiv kopieren - Linux

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 wird find 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 stoppt find 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 '.*' sagt find dass wir alle Namen wollen, die mit einem Punkt beginnen. Dies funktioniert nicht korrekt, wenn die Umgebungsvariable POSIXLY_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 ..... \; sagt find 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, ist cp -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.


Linux
  1. Verstecken Sie die versteckten Linux-Dateien in Windows

  2. Dateien in einem Linux-Verzeichnis rekursiv zählen

  3. Kopieren von Dateien basierend auf dem Änderungsdatum in Linux

  4. Dateien rekursiv umbenennen (Erweiterung ändern) in Linux

  5. Schnelle Möglichkeit, Dateien unter Linux rekursiv zu zählen

Rm-Befehl unter Linux

So ändern Sie die Dateiberechtigungen in Linux rekursiv

So finden und listen Sie die Dateien rekursiv nach Datum in Linux auf

Rsync zeigt Fortschrittsbalken beim Kopieren von Dateien unter Linux an

Wie man Dateien in Linux rekursiv auflistet

So zeigen Sie versteckte Dateien unter Linux an