331

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

Требования:

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

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

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

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

14 ответов14

427

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

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

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

236

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

cp -r /etc/skel /home/user

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

64

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
58

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

cp -rT /etc/skel /home/user

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

23

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

rsync -rtv source_folder/ destination_folder/

3

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

cp -R /etc/skel /home/

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

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

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

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

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

1

Обратите внимание, что есть хитрость командной строки (работает, по крайней мере, в 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
1

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

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

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

1

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

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

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

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

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

1

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

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

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

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

cp -r /etc/skel/* /etc/skel/.* /home/user
0

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

cd /etc/skel
find | cpio -pdumv /home/user
-2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .