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

Как скопировать с помощью cp, чтобы включить скрытые файлы и скрытые каталоги и их содержимое?

Как сделать cp -r скопировать абсолютно all файлов и каталогов в каталог

Требования:

  • Включить скрытые файлы и скрытые каталоги.
  • Будьте одной единственной командой с флагом для включения вышеуказанного.
  • Не нужно полагаться на подгонку по шаблону вообще.

  • Мой уродливый, но работающий, хак:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user
  • Как я могу сделать все это в одной команде без подгонки по шаблону? Какой флаг мне нужно использовать?

Ответы (14)

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

Допустим, вы создали новую папку (или собираетесь ее создать) и хотите скопировать в нее файлы после создания папки

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

Это позволит рекурсивно скопировать все файлы/папку из /etc/skel в уже существующую папку, созданную в первой строке.

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

Не указывайте файлы:

cp -r /etc/skel /home/user

(Обратите внимание, что /home/user не должно уже существовать, иначе он создаст /home/user/skel).

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

Правильным способом сделать это является использование опции -T (--no-target-directory), и рекурсивно копировать папки (без трейлинговых косых черт, звездочек и т.д.), т.е.:

cp -rT /etc/skel /home/user

Это будет копировать содержимое /etc/skel в /home/user (включая скрытые файлы), создавая папку /home/user, если она не существует; однако, -T опция не позволяет скопировать содержимое /etc/skel в новую папку /home/user/skel, если папка /home/user существует.

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

bash сам по себе имеет хорошее решение, у него есть shell option, вы можете cp, mv и так далее:

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

и

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

Вышеуказанное решение является стандартным для bash

NOTE:

&00001

29
29
29
2014-02-20 13:18:25 +0000

Используйте rsync:

rsync -rtv source_folder/ destination_folder/

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

rsync хорошо, но другой выбор:

cp -a src/ dst/

С основной помощью:

-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

Самый простой способ:

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

Выражение {.,}* включает в себя все файлы и каталоги (также начинающиеся с точки).

Если вы не хотите использовать вышеприведенное выражение, то вы можете использовать свойство cp, которым является возможность указать несколько исходников для одной целевой папки:

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

Вы можете использовать rsync.

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

Вы даже можете скопировать по ssh

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

Есть различные флаги, которые вы можете использовать: -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

Если исходный и целевой каталог имеют одно и то же имя, даже если целевой каталог существует, вы можете просто ввести:

cp -R /etc/skel /home/

Это скопирует каталог /etc/skel в /home/, включая скрытые файлы и каталоги.

В конце концов, вы можете скопировать каталог и переименовать его в одну строку :

cp -R /etc/skel /home/ && mv /home/skel /home/user
3
3
3
2015-07-24 13:34:27 +0000

Я пришел сюда, погуглив для решения той же проблемы, а потом понял, что это легко сделать с поиском. Преимущество не зависит от оболочки или специальных утилит, которые могут не быть установлены.

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

Я попробовал трюк с трейлинговым слэшем, но это не сработало для меня.

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

Мое решение этой проблемы, когда мне нужно копировать все файлы (включая . файлов) в целевую директорию получая разрешения, - это: (перезапись, если она уже существует)

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

yes предназначена для автоматической перезаписи файлов назначения, r рекурсивных, v многословных, p сохраняющих разрешения.

Обратите внимание, что путь к источнику не заканчивается на / (таким образом, копируются все файлы/каталог и . файлы)

Каталог назначения заканчивается на /, поскольку мы помещаем содержимое исходной папки в целевой каталог в целом.

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

Обратите внимание, что есть трюк из командной строки (работает, по крайней мере, в sh, bash и ksh): Просто пополните каталог from косой чертой. Это зальет содержимое каталога from в каталог to (по иронии судьбы, я впервые узнал об этом трюке, когда using rsync).

Пример:

/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

Я видел, что cp не всегда копирует скрытые файлы, и если вам нужна команда, которая, кажется, работает на всех linux/unix диалектах, вы должны попробовать использовать:

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

Как минимум в K3b 2.0.3 при добавлении каталога в проект появляется окно вопросов, в котором спрашивается, хотите ли вы включить скрытые файлы … есть также вопрос, который появляется, чтобы спросить о включении ссылок. Отличная вещь!