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

Как я могу сделать cp -r copy абсолютно все файлов и каталогов в каталоге

Требования:

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

Мой уродливый, но рабочий, взломать:

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

Как я могу сделать это все в одной команде без соответствия шаблону? Какой флаг мне нужно использовать?

289 голосов | спросил eleven81 27 +03002009-10-27T22:46:06+03:00312009bEurope/MoscowTue, 27 Oct 2009 22:46:06 +0300 2009, 22:46:06

13 ответов


212

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

  

cp -r /etc /skel /home /user

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

ответил Randy Orrison 27 +03002009-10-27T22:55:27+03:00312009bEurope/MoscowTue, 27 Oct 2009 22:55:27 +0300 2009, 22:55:27
376

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

mkdir /home /<new_user>
cp -r /etc /skel /. /Главная /& л; new_user >

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

ответил Bruno Pereira 13 TueEurope/Moscow2011-12-13T02:00:01+04:00Europe/Moscow12bEurope/MoscowTue, 13 Dec 2011 02:00:01 +0400 2011, 02:00:01
58

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

shopt -s dotglob # для просмотра точечных файлов (включить файлы точек)

и

shopt -u dotglob # для не считая файлов точек (отключите файлы точек)

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

Примечание:

shopt # без аргумента показать статус всех параметров оболочки
-u # abbrivation unset
-s # abbrivation set
ответил PersianGulf 6 FebruaryEurope/MoscowbWed, 06 Feb 2013 05:14:47 +0400000000amWed, 06 Feb 2013 05:14:47 +040013 2013, 05:14:47
44

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

cp -rT /etc /skel /home /user

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

ответил TechnocratiK 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2015 00:50:45 +0300 2015, 00:50:45
23

Использовать rsync:

rsync -rtv source_folder /destination_folder /

ответил user1084282 20 FebruaryEurope/MoscowbThu, 20 Feb 2014 17:18:25 +0400000000pmThu, 20 Feb 2014 17:18:25 +040014 2014, 17:18:25
3

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

cp -R /etc /skel /home /

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

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

cp -R /etc /skel /home /& & & & mv /home /skel /home /user
ответил Gabriel Hautclocq 16 Maypm13 2013, 12:38:46
2

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

cp -a src /dst /

Из основной помощи:

-a, --archive
          так же, как -dR --preserve = all

   -d так же, как --no-dereference --preserve = ссылки

   -R, -r, --рекурсивный
          копировать каталоги рекурсивно
ответил Wink Saville 28 PM00000090000001931 2014, 21:46:19
2

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

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

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

rsync -aP ./from/dir/имя пользователя @ remotehost: /some /other /directory /

Существуют различные флаги, которые вы можете использовать:     -a, --archive # archive (-rlptgoD)

-r, --recursive
-l, --links # копировать символические ссылки в качестве ссылок
-p, --perms # сохранять разрешения
-t, - время # сохранение времени
-g, --группа # сохранить группу
-o, --owner # сохранить владельца
-D # - устройства --специальные

--delete # Удалить дополнительные файлы

Вы можете добавить параметр -P в свою команду.

--partial # По умолчанию rsync удалит любой частично переданный файл, если передача будет прервана. В некоторых случаях более желательно сохранять частично переданные файлы. Использование опции --partial указывает rsync сохранить частичный файл, который должен сделать последующую передачу остальной части файла намного быстрее.

-P # Параметр -P эквивалентен --partial --progress. Его цель состоит в том, чтобы упростить определение этих двух вариантов для длинной передачи, которая может быть прервана.

справочная страница Rsync

ответил RoshP 17 Jpm1000000pmSun, 17 Jan 2016 20:32:26 +030016 2016, 20:32:26
1

Обратите внимание, что существует трюк командной строки (работает, по крайней мере, sh , bash и ksh ): просто суффикс каталог из с косой чертой. Это выведет содержимое каталога из в каталог в (по иронии судьбы, я впервые узнал об этом трюке, когда с помощью 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
,
..
аа

/tmp $ cp -r test_dir1 /test_dir2
/tmp $ ls -1a test_dir2
,
..
.bb
аа
ответил Dustin Oprea 12 Maypm15 2015, 23:00:58
1

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

find /etc /skel /-mindepth 1 -exec cp -r {} /home /имя пользователя /\;

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

ответил Linus 24 J000000Friday15 2015, 16:34:27
1

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

да | cp -rvp /source /directory /destination /directory /

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

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

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

ответил Rajneesh Gadge 30 Jpm1000000pmTue, 30 Jan 2018 23:42:49 +030018 2018, 23:42:49
1

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

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

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

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

cp -r /etc /skel /* /etc/skel/.* /home /user
ответил prostosmirienie 6 J0000006Europe/Moscow 2018, 19:13:41
-2

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

ответил Fred James 15 ThuEurope/Moscow2016-12-15T00:57:06+03:00Europe/Moscow12bEurope/MoscowThu, 15 Dec 2016 00:57:06 +0300 2016, 00:57:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132