Frage Wie kopiert man mit cp versteckte Dateien und versteckte Verzeichnisse und deren Inhalt?


Wie kann ich machen cp -r Kopieren absolut alles der Dateien und Verzeichnisse in einem Verzeichnis

Bedarf:

  • Verstecken Sie versteckte Dateien und versteckte Verzeichnisse.
  • Sei ein einzelner Befehl mit einem Flag, um das oben genannte zu enthalten.
  • Sie müssen sich nicht auf den Mustervergleich verlassen.

Mein hässlicher, aber funktionierender Hack ist:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

Wie kann ich das alles in einem Befehl ohne Mustervergleich tun? Welche Flagge muss ich verwenden?


294
2017-10-27 19:46


Ursprung


Mehr Antworten hier, obwohl sie nicht so gut aussehen; serverfault.com/questions/3154/ ... - Roel Van de Paar
Bitte, Eleven81, erwäge, die akzeptierte Antwort auf die von @bruno pereira angegebene Antwort zu ändern, da dadurch vermieden wird, einen neuen Ordner zu erstellen. Wenn nicht, lass diesen Kommentar eine Warnung für neue Leser sein, um auch die andere (am meisten gewählte) Antwort zu überprüfen. Tx. - Dr Beco


Antworten:


Geben Sie die Dateien nicht an:

cp -r /etc/skel /home/user

(Beachten Sie, dass /home/user muss nicht schon existieren, sonst wird es erstellt /home/user/skel.)


214
2017-10-27 19:55



Ist es möglich, etwas Ähnliches zu verwenden, wenn /home/user/skel  tut existieren? - bradley.ayers
@ bradley.ayers Ich denke, man könnte in ein temporäres Unterverzeichnis kopieren und dann auf die obere Ebene verschieben (da das Verschieben im selben Laufwerk schnell ist). Weniger als ideal, aber kürzer als andere Lösungen für mich. - Halil Özgür
@ bradley.ayers Brunos Antwort unten beantwortet Ihre Frage - Mark
Diese Lösung hat bei mir nicht funktioniert. Es hat keine versteckten Dateien kopiert. Ich benutze CentOS Release 6.5. @ Brunos Lösung hat es geschafft. - Technext
Unter Ubuntu / Debian wird das Verzeichnis 'skel' innerhalb des Zielverzeichnisses platziert und nicht die rekursiven Dateien in skel. Benutzen -T (kein Ziel) pro unten für die ordnungsgemäße Verwendung. (-rT für rekursiv) - bshea


Nehmen wir an, Sie haben den neuen Ordner erstellt (oder erstellen ihn) und möchten die Dateien dorthin kopieren, nachdem der Ordner erstellt wurde

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

Dies kopiert alle Dateien / Ordner rekursiv von /etc/skel in den bereits vorhandenen Ordner, der in der ersten Zeile erstellt wurde.


378
2017-12-12 22:00



Wenn ich es nicht falsch verstanden habe, hat das keine versteckten / dot Dateien kopiert. - Halil Özgür
Funktioniert gut für mich. Notiere dass der '.' ist entscheidend für die Arbeit. - Mark
Es funktioniert, aber warum? Kann im Handbuch keinen Hinweis darauf finden. - Julien Palard
Ich denke, es funktioniert, weil normalerweise ein neuer Ordner mit dem Namen des letzten Ordners im ersten Argument erstellt würde. Da dieser Name jedoch ist ., dieses Verhalten würde es erfordern, ein bereits existierendes Verzeichnis zu erstellen, so dass es nur diesen Schritt überspringt. - Zenexer
@Technext Das Standard-Globbing in bash enthält keine Dateinamen, die mit a beginnen .Um das zu ändern, musst du das verwenden shopt -s dotglob Befehl zuvor, um diese Dateien einschließen zu können. Also mit *Standardmäßig werden Sie aufgefordert, alle Dateien rekursiv aus diesem Verzeichnis zu kopieren, das mit erweitert werden kann * (die standardmäßig keine versteckten Dateien enthält). Während am anderen Ende mit . Sie verwenden cp, um rekursiv alles aus "diesem Verzeichnis" zu kopieren. - Bruno Pereira


bash selbst hat eine gute Lösung, es hat eine shell option, Sie können cp, mv und so weiter.:

shopt -s dotglob # for considering dot files (turn on dot files)

und

shopt -u dotglob # for don't considering dot files (turn off dot files)

Die obige Lösung ist Standard von bash

HINWEIS:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

59
2018-02-06 01:14



Das ist nützlich, wenn Sie nur Inhalt kopieren möchten, ohne ein neues Verzeichnis innerhalb des Ziels zu erstellen. Vor allem, wenn Zielverzeichnis Mount-Punkt ist. - kaszynek
Das ist wirklich die beste Antwort und bringt die Frage auf den Punkt. - Stephen
Es ist setopt für zsh, falls sich jemand anderes wundert. - Pat


Das richtige Mittel dafür ist die Verwendung der -T (--no-target-directory) Option und rekursiv die Ordner kopieren (ohne Schrägstriche, Sternchen, etc.), d.

cp -rT /etc/skel /home/user

Dies kopiert den Inhalt von /etc/skel zu /home/user (einschließlich versteckter Dateien), Erstellen des Ordners /home/user wenn es nicht existiert; aber die -T Option verhindert den Inhalt von /etc/skel aus dem Kopieren in einen neuen Ordner /home/user/skel sollte der Ordner sein /home/user existieren.


45
2017-09-08 21:50



Korrekte Antwort. +1 - bshea
Das war in der Tat genau die richtige Antwort - Gaetan


Verwenden Sie rsync:

rsync -rtv source_folder/ destination_folder/


23
2018-02-20 13:18





Wenn Quell- und Zielverzeichnis den gleichen Namen haben, können Sie, selbst wenn das Zielverzeichnis vorhanden ist, einfach Folgendes eingeben:

cp -R /etc/skel /home/

Dadurch wird das Verzeichnis / etc / skel in / home / kopiert, einschließlich versteckter Dateien und Verzeichnisse.

Schließlich können Sie das Verzeichnis kopieren und in einer einzigen Zeile umbenennen:

cp -R /etc/skel /home/ && mv /home/skel /home/user

3
2018-05-16 08:38



Oder du könntest es einfach benutzen cp -r /etc/skel /home/user zum Umbenennen skel zu user... - David
Das stimmt, nur wenn / home / user noch nicht existiert. - Gabriel Hautclocq


rsync ist gut, aber eine andere Wahl:

cp -a src/ dst/

Von der Haupthilfe:

   -a, --archive
          same as -dR --preserve=all

   -d     same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively

2
2017-08-28 17:46



Ich habe immer cp -r benutzt. Danke, dass du cp -a erwähnt hast - Pinaki Mukherjee