Wie kopiere ich mit cp, um versteckte Dateien und versteckte Verzeichnisse und deren Inhalt einzuschließen?

322398
eleven81

Wie kann ich absolut alle Dateien und Verzeichnisse in einem Verzeichnis cp -rkopieren

Bedarf:

  • Fügen Sie versteckte Dateien und versteckte Verzeichnisse ein.
  • Seien Sie ein einziger Befehl mit einer Flagge, die das obige enthält.
  • Sie müssen sich überhaupt nicht auf Pattern Matching 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 tun, ohne dass das Muster passt? Welche Flagge muss ich verwenden?

320
Mehr Antworten hier, obwohl sie nicht so gut aussehen; http://serverfault.com/questions/3154/recursively-copying-hidden-files-linux/ Roel Van de Paar vor 7 Jahren 1
Bitte, Eleven81, sollten Sie die akzeptierte Antwort in die von @bruno pereira gegebene Antwort ändern, da dadurch die Erstellung eines neuen Ordners vermieden wird. Wenn nicht, lassen Sie diesen Kommentar eine Warnung an neue Leser sein, um auch die andere (am meisten gewählte) Antwort zu überprüfen. Tx. Dr Beco vor 7 Jahren 0

13 Antworten auf die Frage

409
Bruno Pereira

Angenommen, Sie haben den neuen Ordner erstellt (oder werden einen neuen Ordner erstellen) und möchten die Dateien nach dem Erstellen in den Ordner kopieren

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

Dadurch werden alle Dateien / Ordner rekursiv von /etc/skelin in den bereits vorhandenen Ordner kopiert, der in der ersten Zeile erstellt wurde.

Wenn ich es nicht falsch verstanden habe, wurden keine versteckten / Punkt-Dateien kopiert. Halil Özgür vor 11 Jahren 4
Funktioniert gut für mich. Notiere dass der '.' ist entscheidend dafür, dass es funktioniert. Mark vor 10 Jahren 25
Es funktioniert, aber warum? Ich kann im Handbuch keinen Hinweis darauf finden. Julien Palard vor 10 Jahren 11
Dies ist die beste Antwort auf das, was ich brauchte und wahrscheinlich viele andere. Kristopher Ives vor 10 Jahren 0
Ich denke, es funktioniert, weil normalerweise ein neuer Ordner mit dem Namen des letzten Ordners im ersten Argument erstellt wird. Da dieser Name jedoch "." Ist, muss dieses Verhalten ein bereits vorhandenes Verzeichnis erstellen. Dieser Schritt wird also übersprungen. Zenexer vor 9 Jahren 5
Wird als Bearbeitung betrachtet, wird aber eher kommentiert, um mehr Möglichkeiten zur Überprüfung zu geben. Ich denke, es sollte eine dritte Befehlszeile geben, in der "chown -R" steht: /Zuhause/`, um den Besitz der Dateien an den neuen Benutzer zu übergeben. Pavel Šimerda vor 9 Jahren 0
Ich stimme dem nicht zu, die aktuelle Antwort ist die richtige für die Frage. Sie müssten auch den Titel der Frage (und die Frage selbst) bearbeiten, um die vorgeschlagene Änderung an diese Antwort anzupassen. Bruno Pereira vor 9 Jahren 0
Es ist nie schlecht, wenn die Antwort besser ist als die Frage. Könnte in einer separaten Notiz stehen. Wenn Sie das nicht tun, erhalten Sie eine Nichtarbeit, was überraschend sein kann, da die Systemwerkzeuge, die das Skelett automatisch kopieren, sicherstellen, dass der Besitz korrekt ist. Ich würde sogar sagen, dass dies eine Lösung für die Frage ist, aber * es * ein neues Problem auf dem Weg * schafft *, das es nicht löst. Pavel Šimerda vor 9 Jahren 0
Beachten Sie, dass die Antworten nicht nur für das OP gelten, sondern auch für alle, die die Seite über die Websuche finden. Pavel Šimerda vor 9 Jahren 0
Der Grund dafür, dass dies funktioniert, ist dass es gleichbedeutend mit `cp -r / etc / skel / home / ist.`. Der Punkt "." Ist ein Shell-äquivalenter Name für "_This directory_", ebenso wie der doppelte Punkt ".." "_Go ein Verzeichnis_" relativ zum angegebenen Pfad bedeutet. Es ist ein relativer Pfadspezifizierer. Probieren Sie folgendes aus: `ls -d / etc / skel / .` Sie sollten sehen, dass bash` eval dies zu: `/ etc / skel / .` Wenn Sie` ls -l / home / versuchen sollten/ .`, würden Sie Dateien in `/ home / sehen` TrinitronX vor 9 Jahren 1
@BrunoPereira: Danke! Ihre Lösung hat für mich funktioniert, aber ich bin neugierig, warum ich '.' (Punkt) kopiert die versteckte Datei. Technext vor 8 Jahren 0
Hy @Technext, die Erklärung von TrinitronX scheint vor Ort zu sein: Ich könnte es mir nicht besser erklären. Bruno Pereira vor 8 Jahren 0
Hmmm ... ich habe seinen Kommentar gelesen, war dann aber verwirrt, warum * nicht funktioniert. Scheint * stimmt mit allem außer Punktdateien (.) Überein. Technext vor 8 Jahren 0
@Technext Das Standard-Globbing in bash enthält keine Dateinamen, die mit einem `.` beginnen, um zu ändern, dass Sie den Befehl` shopt -s dotglob` verwenden müssen, bevor Sie diese Dateien einschließen können. Mit `*` möchten Sie also standardmäßig alle Dateien rekursiv aus diesem Verzeichnis kopieren, das mit `*` (das standardmäßig keine versteckten Dateien enthält) erweitert werden kann. Am anderen Ende mit `.` verwenden Sie cp, um alles rekursiv von" diesem Verzeichnis "zu kopieren. Bruno Pereira vor 8 Jahren 21
@BrunoPereira: Vielen Dank für die Erklärung! :) Jetzt ist alles klar. :) Technext vor 8 Jahren 0
Dies sollte eine akzeptierte Antwort sein Drew vor 6 Jahren 0
@JulienPalard [endlich haben wir eine Antwort!] (Https://unix.stackexchange.com/a/409227/67771) iFreilicht vor 6 Jahren 1
229
Randy Orrison

Geben Sie die Dateien nicht an:

cp -r /etc/skel /home/user

(Beachten Sie, dass /home/useres nicht bereits existieren darf, sonst wird es erstellt /home/user/skel.)

Ist es möglich, etwas Ähnliches zu verwenden, wenn * / home / user / skel * vorhanden ist *? bradley.ayers vor 12 Jahren 48
@ bradley.ayers Ich denke, man könnte in ein temporäres Unterverzeichnis kopieren und dann auf die obere Ebene verschieben (da sich das gleiche Laufwerk schnell bewegt). Weniger als ideal, aber kürzer als andere Lösungen für mich. Halil Özgür vor 11 Jahren 0
@ bradley.ayers Brunos Antwort unten beantwortet Ihre Frage Mark vor 10 Jahren 7
Diese Lösung hat bei mir nicht funktioniert. Es wurden keine versteckten Dateien kopiert. Ich verwende die CentOS-Version 6.5. @ Brunos Lösung hat den Trick geleistet. Technext vor 8 Jahren 1
Unter ubuntu / debian befindet sich das Verzeichnis 'skel' im Zielverzeichnis und nicht die rekursierten Dateien im skel. Verwenden Sie `-T` (kein Ziel) für die korrekte Verwendung. (`-rT` für rekursiv) bshea vor 6 Jahren 2
Dies kopiert keine versteckten (Punkt-) Dateien wie '.profile' oder '.bashrc'. Drew vor 6 Jahren 0
Wenn `/ home / user` existiert, werden die Inhalte von` / etc / skel` kopiert, ohne dass `/ home / user / skel`:` find / etc / skel -type f -exec cp {} / home erstellt wird / Benutzer \; ` Ralph Bolton vor 6 Jahren 0
** Beachten Sie **, dass Dateiattribute standardmäßig nicht beibehalten werden. Stellen Sie also sicher, dass Sie Ihre Mischung aus Zeitstempeln / xattr / etc hinzufügen. über die -p / - erhalte Flagge! (vergleiche Manpage) isync vor 6 Jahren 0
63
PersianGulf

bash itself has a good solution, it has a shell option, You can cp, mv and so on.:

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

and

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

Above solution is standard of bash

NOTE:

shopt # without argument show status of all shell options -u # abbrivation of unset  -s # abbrivation of set 
Das ist nützlich, wenn Sie nur Inhalte kopieren möchten, ohne ein neues Verzeichnis im Ziel zu erstellen. Besonders wenn das Zielverzeichnis ein Mount-Punkt ist. kaszynek vor 10 Jahren 2
Das ist wirklich die beste Antwort und bringt die Frage auf den Punkt. Stephen vor 9 Jahren 3
Es ist `setopt` für zsh, falls sich jemand anderes wundert. Pat vor 9 Jahren 6
54
TechnocratiK

Das richtige Mittel dazu ist, die -T (--no-target-directory)Option zu verwenden und die Ordner rekursiv zu kopieren (ohne nachstehende Schrägstriche, Sternchen usw.), dh:

cp -rT /etc/skel /home/user 

Dadurch wird der Inhalt der Kopie /etc/skelzu /home/user(einschließlich versteckte Dateien), die Schaffung der Ordner, /home/userwenn es nicht vorhanden ist; Die -TOption verhindert jedoch, dass der Inhalt von /etc/skelin einen neuen Ordner kopiert wird, /home/user/skelfalls der Ordner /home/uservorhanden ist.

Korrekte Antwort. +1 bshea vor 6 Jahren 2
das war in der Tat genau die richtige Antwort Gaetan vor 6 Jahren 0
Dies ist die BESTE Antwort der Gruppe. Es ist das einzige, das das Problem löst, ohne es zu komplizieren ZaxLofful vor 5 Jahren 0
23
user1084282

Verwenden Sie Rsync:

rsync -rtv source_folder/ destination_folder/

3
Gabriel Hautclocq

If your source and target directory have the same name, even if target directory exists, you can simply type:

cp -R /etc/skel /home/ 

This will copy the /etc/skel directory into /home/, including hidden files and directories.

Eventually, you can copy the directory and rename it in a single line :

cp -R /etc/skel /home/ && mv /home/skel /home/user 
Oder Sie können einfach "cp -r / etc / skel / home / user" verwenden, um "skel" in "user" umzubenennen ... David vor 10 Jahren 0
Das ist richtig, nur wenn / home / user noch nicht existiert. Gabriel Hautclocq vor 10 Jahren 0
2
Wink Saville

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 
Ich habe immer cp -r verwendet. Danke, dass Sie cp -a erwähnt haben Pinaki Mukherjee vor 6 Jahren 0
2
RoshP

Sie könnten rsync verwenden.

rsync -aP ./from/dir/ /some/other/directory/ 

Sie können sogar über SSH kopieren

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/ 

Es gibt verschiedene Flags, die Sie verwenden können: -a, --archive # archive (-rlptgoD)

-r, --recursive -l, --links # copy symlinks as links -p, --perms # preserve permissions -t, --times # preserve times -g, --group # preserve group -o, --owner # preserve owner -D # --devices --specials  --delete # Delete extra files  You may want to add the -P option to your command.  --partial # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.  -P # The -P option is equivalent to --partial --progress. Its purpose is to make it much easier to specify these two options for a long transfer that may be interrupted. 

Rsync-Manpage

1
Dustin Oprea

Beachten Sie, dass es einen Befehlszeilentrick gibt (funktioniert zumindest in sh, bash und ksh ): Suffixieren Sie das from- Verzeichnis mit einem Schrägstrich. Dadurch wird der Inhalt des Verzeichnisses " from" in das Verzeichnis " to" verschoben (ironischerweise hatte ich bei der Verwendung von rsync diesen Trick kennen gelernt ).

Beispiel:

/tmp$ mkdir test_dir1 /tmp$ cd test_dir1/ /tmp/test_dir1$ touch aa /tmp/test_dir1$ touch .bb /tmp/test_dir1$ cd .. /tmp$ mkdir test_dir2  /tmp$ cp -r test_dir1/* test_dir2 /tmp$ ls -1a test_dir2 . .. aa  /tmp$ cp -r test_dir1/ test_dir2 /tmp$ ls -1a test_dir2 . .. .bb aa 
1
Linus

Ich bin hierhergekommen, um nach dem gleichen Problem zu suchen, und dann wurde mir klar, dass es einfach ist, sie zu finden. Der Vorteil hängt nicht von der Shell oder von speziellen Dienstprogrammen ab, die möglicherweise nicht installiert werden.

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \; 

Ich habe den Trick mit dem nachgestellten Schrägstrich ausprobiert, aber das hat für mich nicht funktioniert.