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


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

Требования:

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

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

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

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


294
2017-10-27 19:46


происхождения


Больше ответов здесь, хотя они выглядят не так хорошо; serverfault.com/questions/3154/... - Roel Van de Paar
Пожалуйста, Eleven81, подумайте об изменении принятого ответа на вопрос, предоставленный @bruno pereira, потому что он избегает создания новой папки. Если нет, пусть этот комментарий станет предупреждением новым читателям, чтобы проверить и другой (самый проголосовавший) ответ. Tx. - Dr Beco


ответы:


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

cp -r /etc/skel /home/user

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


214
2017-10-27 19:55



Можно ли использовать что-то подобное, если /home/user/skel  делает существовать? - bradley.ayers
@ bradley.ayers Я думаю, что можно скопировать во временный подкаталог, а затем переместить их на верхний уровень (так как перемещение на одном диске происходит быстро). Меньше идеала, но меньше, чем другие решения для меня. - Halil Özgür
@ bradley.ayers Ответ Бруно ниже затрагивает ваш вопрос - Mark
Это решение не сработало для меня. Он не копировал скрытые файлы. Я использую версию CentOS 6.5. @ Решение Бруно сделало трюк. - Technext
В разделе ubuntu / debian это помещает каталог «skel» внутри целевого каталога, а не рекурсивные файлы внутри skel. использование -T (без цели) для использования ниже. (-rT для рекурсивного) - bshea


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

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

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


378
2017-12-12 22:00



Если я не ошибаюсь, это не копирует скрытые / точечные файлы. - Halil Özgür
Хорошо работает для меня. Обратите внимание, что '.' имеет решающее значение для его работы. - Mark
Это работает, но почему? Не можете найти ссылку на это в руководстве. - Julien Palard
Я думаю, что это работает, потому что обычно это создаст новую папку с именем последней папки в первом аргументе. Однако, поскольку это имя ., для этого поведения потребуется создать уже существующий каталог, поэтому он просто пропустит этот шаг. - Zenexer
@Technext По умолчанию в bash не включаются имена файлов, начиная с ., чтобы изменить, что вам нужно использовать shopt -s dotglob перед тем, как включить эти файлы. Таким образом, с *, по умолчанию вы запрашиваете рекурсивно копировать все файлы из этого каталога, которые можно развернуть с помощью * (который по умолчанию не включает скрытые файлы). В то время как на другом конце . вы используете cp для рекурсивного копирования всего из этого каталога. - Bruno Pereira


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

ЗАМЕТКА:

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

59
2018-02-06 01:14



Это полезно, если вы хотите скопировать только контент без создания нового каталога внутри места назначения. Особенно, если точкой назначения является точка монтирования. - kaszynek
Это действительно лучший ответ и доходит до сути вопроса. - Stephen
Это setopt для zsh, в случае, если кто-то еще задается вопросом. - Pat


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

cp -rT /etc/skel /home/user

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


45
2017-09-08 21:50



Правильный ответ. +1 - bshea
это был действительно правильный ответ - Gaetan


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

rsync -rtv source_folder/ destination_folder/


23
2018-02-20 13:18





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

cp -R /etc/skel /home/

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

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

cp -R /etc/skel /home/ && mv /home/skel /home/user

3
2018-05-16 08:38



Или вы можете просто использовать cp -r /etc/skel /home/user для переименования skel в user... - David
Правильно, только если / home / user еще не существует. - Gabriel Hautclocq


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

2
2017-08-28 17:46



Я всегда использовал cp -r. Спасибо, что упомянул cp -a - Pinaki Mukherjee


Вы можете использовать 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


2
2018-01-17 17:32





Обратите внимание, что есть трюк командной строки (работает, по крайней мере, ш, удар, а также КШ): Просто суффикс из каталог с косой чертой. Это залит содержимое из директории в в (по иронии судьбы, я впервые узнал об этом трюке, когда с помощью  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
2018-05-12 20:00