Как скопировать с помощью cp, чтобы включить скрытые файлы и скрытые каталоги и их содержимое?
Как я могу сделать cp -r
copy абсолютно все файлов и каталогов в каталоге
Требования:
- Включить скрытые файлы и скрытые каталоги.
- Будь одной командой с флагом, чтобы включить выше.
- Не нужно вообще полагаться на сопоставление шаблонов.
Мой уродливый, но рабочий, взломать:
cp -r /etc /skel /* /home /user
cp -r /etc/skel/.[^.]* /home /user
Как я могу сделать это все в одной команде без соответствия шаблону? Какой флаг мне нужно использовать?
13 ответов
Не указывайте файлы:
cp -r /etc /skel /home /user
(Обратите внимание, что /home /user
уже не существует, иначе он создаст /home /user /skel
.)
Предположим, вы создали новую папку (или собираетесь ее создать) и хотите скопировать файлы после создания папки
mkdir /home /<new_user>
cp -r /etc /skel /. /Главная /& л; new_user >
Это скопирует все файлы /папки из /etc /skel
в уже существующую папку, созданную в первой строке.
bash
имеет хорошее решение, у него есть опция оболочки , вы можете
cp
, mv
и и так далее:
shopt -s dotglob # для просмотра точечных файлов (включить файлы точек)
и
shopt -u dotglob # для не считая файлов точек (отключите файлы точек)
Выше решение является стандартным для bash
Примечание:
shopt # без аргумента показать статус всех параметров оболочки
-u # abbrivation unset
-s # abbrivation set
Правильным средством для этого является использование опции -T (--no-target-directory)
и рекурсивная копия папок (без косых черт, звездочек и т. д.), т.е.
cp -rT /etc /skel /home /user
Это скопирует содержимое /etc /skel
в /home /user
(включая скрытые файлы), создав папку /home /user
если он не существует; однако параметр -T
не позволяет скопировать содержимое /etc /skel
в новую папку /home /user /skel
, если папка /home /user
.
Использовать rsync:
rsync -rtv source_folder /destination_folder /
Если ваш источник и целевой каталог имеют одинаковое имя, даже если целевой каталог существует, вы можете просто ввести:
cp -R /etc /skel /home /
Это скопирует каталог /etc /skel в /home /, включая скрытые файлы и каталоги.
В конце концов вы можете скопировать каталог и переименовать его в одну строку:
cp -R /etc /skel /home /& & & & mv /home /skel /home /user
rsync
хорош, но другой выбор:
cp -a src /dst /
Из основной помощи:
-a, --archive
так же, как -dR --preserve = all
-d так же, как --no-dereference --preserve = ссылки
-R, -r, --рекурсивный
копировать каталоги рекурсивно
Вы можете использовать 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. Его цель состоит в том, чтобы упростить определение этих двух вариантов для длинной передачи, которая может быть прервана.
Обратите внимание, что существует трюк командной строки (работает, по крайней мере, 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
аа
Я пришел сюда с Googled для решения одной и той же проблемы, затем понял, что это легко сделать с поиском. Преимущество этого не зависит от оболочки или специальных утилит, которые не могут быть установлены.
find /etc /skel /-mindepth 1 -exec cp -r {} /home /имя пользователя /\;
Я попробовал трюк с завершающим косой чертой, но это не сработало для меня.
Мое решение для этой проблемы, когда мне нужно скопировать все файлы (включая .
) в целевой каталог , сохраняющий разрешения : (перезаписать, если уже существует)
да | cp -rvp /source /directory /destination /directory /
yes
предназначен для автоматической перезаписи файлов назначения,
r
рекурсивный,
v
verbose,
p
сохранить разрешения.
Обратите внимание, что путь источника не заканчивается на /
(так что все файлы /каталог и. файлы копируются)
Целевой каталог заканчивается на /
, поскольку мы помещаем содержимое исходной папки в пункт назначения целиком.
Самый простой способ:
cp -r /etc/skel/{.,}* /home /user
Выражение {.,} *
включает в себя все файлы и каталоги (также начиная с точки).
Если вы не хотите использовать выражение выше, вы можете использовать свойство cp
, которое может указывать несколько источников для одной целевой папки:
cp -r /etc /skel /* /etc/skel/.* /home /user
По крайней мере, K3b 2.0.3 появляется окно вопросов, которое появляется, когда каталог добавляется в проект, который спрашивает, хотите ли вы включать скрытые файлы ... есть также вопрос, который появляется до спросите о включении ссылок. Хороший материал!