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


392

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

Bedarf:

  • Schließen Sie versteckte Dateien und versteckte Verzeichnisse ein.
  • Seien Sie ein einziger Befehl mit einem Flag, um das Obige einzuschließen.
  • 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 ohne den Mustervergleich tun? Welche Flagge muss ich verwenden?


1
Weitere Antworten hier, obwohl sie nicht so gut aussehen; serverfault.com/questions/3154/…
Roel Van de Paar

Bitte, Eleven81, überlegen Sie, die akzeptierte Antwort auf die von @bruno pereira angegebene zu ändern, da hierdurch das Erstellen eines neuen Ordners vermieden wird. Wenn nicht, sei dieser Kommentar eine Warnung für neue Leser, um auch die andere (am häufigsten gewählte) Antwort zu überprüfen. Tx.
Dr. Beco

Antworten:


265

Geben Sie die Dateien nicht an:

cp -r /etc/skel /home/user

(Beachten Sie, dass dies noch /home/usernicht existieren darf, sonst wird es erstellt /home/user/skel.)


61
Ist es möglich, etwas Ähnliches zu verwenden, wenn /home/user/skel es existiert?
Bradley.ayers

@bradley.ayers Ich denke, man könnte sie in ein temporäres Unterverzeichnis kopieren und dann in die obere Ebene verschieben (da das Verschieben im selben Laufwerk sehr schnell ist). Weniger als ideal, aber für mich kürzer als andere Lösungen.
Halil Özgür

7
@ Bradley.ayers Brunos Antwort unten beantwortet Ihre Frage
Mark

1
Diese Lösung hat bei mir nicht funktioniert. Versteckte Dateien wurden nicht kopiert. Ich verwende CentOS Version 6.5. @ Brunos Lösung hat es geschafft.
Technext

2
Unter Ubuntu / Debian wird das Verzeichnis "skel" in das Zielverzeichnis und nicht die rekursiven Dateien in das Verzeichnis "skel" gestellt. Verwenden Sie -T(kein Ziel) für die ordnungsgemäße Verwendung. ( -rTfür rekursive)
bshea

468

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

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.


5
Wenn ich nichts falsch gemacht habe, wurden keine versteckten / dot-Dateien kopiert.
Halil Özgür

34
Funktioniert gut für mich. Notiere dass der '.' ist entscheidend dafür, dass es funktioniert.
Mark

12
Es funktioniert, aber warum? Ein Verweis darauf ist im Handbuch nicht zu finden.
Julien Palard

5
Ich denke, es funktioniert, weil dies normalerweise einen neuen Ordner mit dem Namen des letzten Ordners im ersten Argument erstellen würde. Da dieser Name jedoch verwendet wird ., muss er für dieses Verhalten ein bereits vorhandenes Verzeichnis erstellen, sodass dieser Schritt nur übersprungen wird.
Zenexer

28
@Technext Das Standard-Globbing in Bash enthält keine Dateinamen, die mit a beginnen ., um zu ändern, dass Sie den shopt -s dotglobBefehl verwenden müssen, bevor Sie diese Dateien einschließen können. Daher *werden Sie standardmäßig aufgefordert, alle Dateien rekursiv aus diesem Verzeichnis zu kopieren, das mithilfe von *(das standardmäßig keine ausgeblendeten Dateien enthält) erweitert werden kann. Während Sie am anderen Ende mit .cp arbeiten, kopieren Sie rekursiv alles aus "diesem Verzeichnis".
Bruno Pereira

79

Verwenden Sie dazu die -T (--no-target-directory)Option und kopieren Sie die Ordner rekursiv (ohne abschließende Schrägstriche, Sternchen usw.).

cp -rT /etc/skel /home/user

Dadurch wird der Inhalt von /etc/skelnach /home/user(einschließlich versteckter Dateien) kopiert und der Ordner erstellt, /home/userfalls er nicht vorhanden ist. Die -TOption verhindert jedoch, dass der Inhalt /etc/skelin einen neuen Ordner kopiert wird, /home/user/skelfalls der Ordner /home/uservorhanden ist.


3
Korrekte Antwort. +1
bshea

Dies war in der Tat genau die richtige Antwort
Gaetan

Dies ist die beste Antwort des Haufen; Es ist die einzige, die das Problem löst, ohne es zu komplizieren
ZaxLofful

funktioniert genau wie erwartet zu kopieren
Chetabahana

Ich liebe es, wenn Sie die richtige Cmd-Flagge für den einen Fall verwenden.
Tran Triet

66

bashselbst hat eine gute lösung, es hat eine shell option, du kannst cp, mvund 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 entspricht dem Standard von bash

HINWEIS:

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

2
Dies ist nützlich, wenn Sie nur Inhalte kopieren möchten, ohne ein neues Verzeichnis innerhalb des Ziels zu erstellen. Vor allem, wenn das Zielverzeichnis der Einhängepunkt ist.
Kaszynek

3
Dies ist wirklich die beste Antwort und bringt die Frage
Stephen

7
Es ist setoptfür zsh, falls sich jemand fragt.
Pat

25

Verwenden Sie rsync:

rsync -rtv source_folder/ destination_folder/


Beste Option für mich, obwohl ich --progress verwende, um mehr Feedback zum gesamten Prozess zu erhalten.
Edenshaw

5

rsync ist gut, aber eine andere Wahl:

cp -a src/ dst/

Aus 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. Vielen Dank, dass Sie cp -a
Pinaki Mukherjee am

4

Wenn Ihr Quell- und Zielverzeichnis denselben Namen haben, können Sie einfach Folgendes eingeben, auch wenn das Zielverzeichnis vorhanden ist:

cp -R /etc/skel /home/

Dadurch wird das Verzeichnis / etc / skel nach / 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

Oder Sie könnten einfach cp -r /etc/skel /home/userzum Umbenennen skelin user...
David

Das ist richtig, nur wenn / home / user noch nicht existiert.
Gabriel Hautclocq

4

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


4

Der einfachste Weg ist:

cp -r /etc/skel/{.,}* /home/user

Der Ausdruck {.,}*enthält alle Dateien und Verzeichnisse (auch beginnend mit einem Punkt).

Wenn Sie den obigen Ausdruck nicht verwenden möchten, können Sie die cpEigenschaft verwenden, mit der Sie mehrere Quellen für einen Zielordner angeben können:

cp -r /etc/skel/* /etc/skel/.* /home/user

1
dies würde Dateien wie ..anythingoder ...anythingusw. vermissen . - stackoverflow.com/a/31438355/2351568 enthält die korrekte reguläre Ausdrucksweise für dieses Problem. || aber trotzdem mit shopt -s dotglobist immer noch die bessere lösung!
DJCrashdummy

@DJCrashdummy leider verstehe ich nicht warum du deine Aufmerksamkeit geschrieben hast. Schließlich berücksichtigt meine Lösung die Fälle, über die Sie schreiben. Grüße
simhumileco

Entschuldigung falscher Text! - Das Problem mit Ihrer Antwort ist, dass es auch .und berücksichtigt ..(was dem aktuellen und seinem enthaltenen Ordner entspricht). || Aber die Antwort im Link erklärt es weiter und bietet eine Lösung.
DJCrashdummy

2

Beachten Sie, dass es einen Befehlszeilentrick gibt (funktioniert mindestens in sh , bash und ksh ): Fügen Sie dem Verzeichnis from einen Schrägstrich hinzu. Dadurch wird der Inhalt des " from" -Verzeichnisses in das " to" -Verzeichnis gegossen (ironischerweise hatte ich diesen Trick zum ersten Mal bei Verwendung von rsync kennengelernt ).

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

2

Ich bin hierher gekommen, um nach einer Lösung für das gleiche Problem zu suchen. Dann habe ich festgestellt, dass es einfach ist, sie zu finden. Der Vorteil ist nicht abhängig von der Shell oder speziellen Dienstprogrammen, die möglicherweise nicht installiert sind.

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

Ich habe es mit einem abschließenden Schrägstrich versucht, aber das hat bei mir nicht funktioniert.


2

Meine Lösung für dieses Problem, wenn ich alle Dateien (einschließlich .Dateien) in ein Zielverzeichnis kopieren muss, in dem die Berechtigungen erhalten bleiben, lautet: (Überschreiben, falls bereits vorhanden)

yes | cp -rvp /source/directory /destination/directory/

yesist für das automatische Überschreiben von Zieldateien, rrekursiv, vausführlich, pBerechtigungen behalten.

Beachten Sie, dass der Quellpfad nicht mit einem endet/ (daher werden alle Dateien / Verzeichnisse und .dateien kopiert).

Das Zielverzeichnis endet damit/ , dass wir den Inhalt des Quellordners zum Ziel als Ganzes verschieben.


1

Ich habe gesehen, dass cp versteckte Dateien nicht immer kopiert. Wenn Sie einen Befehl möchten, der in allen Linux- / Unix-Dialekten funktioniert, sollten Sie versuchen, Folgendes zu verwenden:

cd /etc/skel
find | cpio -pdumv /home/user

-2

Ab K3b 2.0.3 wird beim Hinzufügen des Verzeichnisses zum Projekt ein Fragenfeld angezeigt, in dem Sie gefragt werden, ob Sie versteckte Dateien einbeziehen möchten. Außerdem wird eine Frage zum Einbeziehen angezeigt links. Gutes Zeug!


"Ein Fragefeld, das auftaucht" - für einen Shell (CLI) -Befehl?
Scott
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.