it-swarm-ru.tech

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

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

Требования:

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

Мой некрасивый, но работающий хак это:

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

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

356
eleven81

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

cp -r /etc/skel /home/user

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

244
Randy Orrison

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

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

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

445
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
65
PersianGulf

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

cp -rT /etc/skel /home/user

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

65
TechnocratiK

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

rsync -rtv source_folder/ destination_folder/

24
user1084282

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

cp -R /etc/skel /home/

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

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

cp -R /etc/skel /home/ && mv /home/skel /home/user
4
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
4
Wink Saville

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

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

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

rsync -aP ./from/dir/ [email protected]:/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

3
RoshP

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

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

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

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

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

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

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

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

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

2
Linus

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

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

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

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

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

2
Rajneesh Gadge

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

cd /etc/skel
find | cpio -pdumv /home/user
1
Mikael Nyborg