2009-10-27 19:46:06 +0000 2009-10-27 19:46:06 +0000
423
423

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

Wie kann ich cp -r absolut alle Dateien und Verzeichnisse in einem Verzeichnis kopieren?

Voraussetzungen:

  • Versteckte Dateien und versteckte Verzeichnisse einbeziehen.
  • Seien Sie ein einziger Befehl mit einem Flag, um die oben genannten einzubeziehen.
  • Sie müssen sich überhaupt 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 den Mustervergleich machen? Welche Flagge muss ich verwenden?

Antworten (14)

492
492
492
2011-12-12 22:00:01 +0000

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

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

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

281
281
281
2009-10-27 19:55:27 +0000

Geben Sie die Dateien nicht an:

cp -r /etc/skel /home/user

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

95
95
95
2015-09-08 21:50:45 +0000

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

cp -rT /etc/skel /home/user

Dadurch wird der Inhalt von /etc/skel nach /home/user (einschließlich versteckter Dateien) kopiert und der Ordner /home/user erstellt, falls er nicht existiert; die Option -T verhindert jedoch, dass der Inhalt von /etc/skel in einen neuen Ordner /home/user/skel kopiert wird, falls der Ordner /home/user existiert.

68
68
68
2013-02-06 01:14:47 +0000

bash selbst hat eine gute Lösung, sie 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)

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
29
29
29
2014-02-20 13:18:25 +0000

Verwenden Sie rsync:

rsync -rtv source_folder/ destination_folder/

7
7
7
2014-08-28 17:46:19 +0000

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
5
5
5
2018-06-06 16:13:41 +0000

Der einfachste Weg ist:

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

Der Ausdruck {.,}* schließt alle Dateien und Verzeichnisse ein (beginnt ebenfalls mit einem Punkt).

Wenn Sie den obigen Ausdruck nicht verwenden möchten, dann können Sie die Eigenschaft cp verwenden, d.h. die Möglichkeit, mehrere Quellen für einen Zielordner anzugeben:

cp -r /etc/skel/* /etc/skel/.* /home/user
4
4
4
2016-01-17 17:32:26 +0000

Sie können 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 man page

4
4
4
2013-05-16 08:38:46 +0000

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

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
3
3
3
2015-07-24 13:34:27 +0000

Ich bin hierher gekommen, nachdem ich nach einer Lösung für dasselbe Problem gegoogelt hatte, und dann wurde mir klar, dass es einfach ist, eine Lösung zu finden. Der Vorteil ist, dass es nicht von der Shell abhängt, oder von speziellen Hilfsprogrammen, die möglicherweise nicht installiert sind.

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

Ich habe den Trick mit dem abschließenden Schrägstrich ausprobiert, aber das hat bei mir nicht funktioniert.

2
2
2
2018-01-30 20:42:49 +0000

Meine Lösung für dieses Problem, wenn ich alle Dateien (einschließlich . Dateien) in ein Zielverzeichnis unter Beibehaltung der Berechtigungen kopieren muss, lautet (überschreiben, falls bereits vorhanden)

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

yes ist für das automatische Überschreiben der Zieldateien, r rekursiv, v ausführlich, p behält die Berechtigungen bei.

Beachten Sie, daß der Quellpfad nicht mit / endet (so daß alle Dateien/Verzeichnis und .

2
2
2
2015-05-12 20:00:58 +0000

Beachten Sie, dass es einen Kommandozeilen-Trick gibt (funktioniert zumindest in sh, bash und ksh): Suffixen Sie einfach das Verzeichnis from mit einem Schrägstrich. Dadurch wird der Inhalt des von Verzeichnisses in das bis Verzeichnis gegossen (ironischerweise hatte ich diesen Trick zum ersten Mal bei der 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
1
1
1
2019-02-13 10:18:49 +0000

Ich habe gesehen, dass cp nicht immer versteckte Dateien kopiert, und wenn Sie einen Befehl wünschen, der in allen Linux/Unix-Dialekten zu funktionieren scheint, sollten Sie versuchen:

cd /etc/skel
find | cpio -pdumv /home/user
-2
-2
-2
2016-12-14 21:57:06 +0000

Ab mindestens K3b 2.0.3 gibt es eine Fragebox, die auftaucht, wenn das Verzeichnis zum Projekt hinzugefügt wird, die fragt, ob Sie versteckte Dateien einbinden wollen … es gibt auch eine Frage, die auftaucht, um nach dem Einbinden von Links zu fragen. Nettes Zeug!