Як скопіювати за допомогою cp, щоб включити приховані файли та приховані каталоги та їх вміст?


392

Як я можу cp -rскопіювати абсолютно всі файли та каталоги в каталог

Вимоги:

  • Додайте приховані файли та приховані каталоги.
  • Будьте однією командою з прапором, щоб включити вище.
  • Не потрібно покладатися на відповідність шаблонів взагалі.

Мій некрасивий, але робочий, хак:

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

Як я можу це зробити за одну команду без відповідності шаблону? Який прапор мені потрібно використовувати?


1
Більше відповідей тут, хоча вони виглядають не так добре; serverfault.com/questions/3154/…
Ван де Паар

Будь ласка, Eleven81, подумайте про зміну прийнятої відповіді на відповідь, надану @bruno pereira, оскільки це дозволяє уникнути створення нової папки. Якщо ні, нехай цей коментар буде попередженням для нових читачів, щоб перевірити також іншу (найбільш проголосовану) відповідь. Тх.
Д-р Беко

Відповіді:


265

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

cp -r /etc/skel /home/user

(Зверніть увагу, що /home/userвже не має існувати, інакше це створить /home/user/skel.)


61
Чи можливо використовувати щось подібне, якщо /home/user/skel воно існує?
bradley.ayers

@ bradley.ayers Я думаю, що можна скопіювати у тимчасовий підкаталог, а потім перенести їх на верхній рівень (оскільки переміщення в одному приводі відбувається швидко). Менш ідеального, але коротшого, ніж інші рішення для мене.
Halil Özgür

7
@ bradley.ayers Відповідь Бруно нижче стосується вашого питання
Марк

1
Це рішення не спрацювало для мене. Він не копіював приховані файли. Я використовую CentOS випуск 6.5. @ Рішення Бруно зробив свою справу.
Technext

2
Під ubuntu / debian це розміщує каталог 'skel' всередині цільового каталогу, а не повторювані файли всередині skel. -TДля правильного використання використовуйте (без цілі) нижче. ( -rTдля рекурсивних)
bshea

468

Скажімо, ви створили нову папку (або збираєтесь створити її) і хочете скопіювати файли до неї після створення папки

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

Це буде копіювати всі файли / папки рекурсивно з /etc/skelу вже існуючу папку, створену в першому рядку.


5
Якщо я не помилився, він не скопіював приховані / крапкові файли.
Halil Özgür

34
Добре працює для мене. Зауважте, що "." критично важлива для цього робота.
Марк

12
Це працює, але чому? Неможливо знайти посилання на це в посібнику.
Жульєн Палард

5
Я думаю, що це працює, тому що зазвичай це створило б нову папку з назвою останньої папки в першому аргументі. Однак, оскільки це ім'я ., така поведінка вимагає, щоб він створив уже існуючий каталог, тому він просто пропускає цей крок.
Zenexer

28
@Technext Глобулювання за замовчуванням у bash не включає імена файлів, починаючи з a ., щоб змінити, що вам потрібно скористатися shopt -s dotglobкомандою раніше, щоб мати можливість включати ці файли. Так *, за замовчуванням ви просите скопіювати всі файли рекурсивно з цього каталогу, які можна розширити за допомогою *(який не включає приховані файли за замовчуванням). На іншому кінці .ви використовуєте cp, щоб рекурсивно копіювати все з "цього каталогу".
Бруно Перейра

79

Правильний спосіб зробити це - скористатися -T (--no-target-directory)опцією та рекурсивно копіювати папки (без зворотних косих рядків, зірочок тощо), тобто:

cp -rT /etc/skel /home/user

Це буде копіювати вміст /etc/skelв /home/user(включаючи приховані файли), створюючи папку , /home/userякщо вона не існує; однак -Tопція не дозволяє /etc/skelкопіювати вміст у нову папку, /home/user/skelякщо папка /home/userіснує.


3
Правильна відповідь. +1
bshea

це справді була правильна відповідь
Гаетан

це найкраща відповідь групи; це єдиний, який вирішує проблему, не ускладнюючи її
ZaxLofful

точно працює, щоб скопіювати, як очікувалося
Четабахана

Любіть, коли ви використовуєте правильний прапор cmd для одного випадку.
Трієт Трієт

66

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

2
Це корисно, коли ви хочете скопіювати лише вміст, не створюючи нового каталогу всередині призначення. Особливо, коли місце призначення реж.
kaszynek

3
Це дійсно найкраща відповідь і досягає
Стівен

7
Це setoptдля zsh, на випадок, якщо хтось ще задумається.
Пт

25

Використовуйте rsync:

rsync -rtv source_folder/ destination_folder/


Найкращий варіант для мене, хоча я використовую - прогрес, щоб отримати більше відгуків про весь процес.
Еденшо

5

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

Я завжди використовував cp -r. Дякуємо за те, що згадали cp -a
Pinaki Mukherjee

4

Якщо ваш джерело та цільовий каталог мають одне ім’я, навіть якщо цільовий каталог існує, ви можете просто ввести:

cp -R /etc/skel /home/

Це скопіює каталог / etc / skel в / home /, включаючи приховані файли та каталоги.

Зрештою, ви можете скопіювати каталог і перейменувати його в один рядок:

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

Або ви можете просто використовувати cp -r /etc/skel /home/userдля перейменування skelна user...
Девід

Це правильно, лише якщо / home / user ще не існує.
Габріель Хацлокк

4

Ви можете використовувати 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


4

Найпростіший спосіб:

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

Вираз {.,}*включає всі файли та каталоги (також починаючи з крапки).

Якщо ви не хочете використовувати вище вираження, тоді ви можете скористатися cpвластивістю, яка полягає у можливості вказувати кілька джерел для однієї цільової папки:

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

1
це буде НЕ вистачати файли , як ..anythingі ...anythingт.д. - stackoverflow.com/a/31438355/2351568 містить правильне регулярний вираз для цієї проблеми. || але все-таки використання shopt -s dotglobвсе-таки краще рішення!
DJCrashdummy

@DJCrashdummy, на жаль, я не розумію, чому ти написав свою увагу. Зрештою, моє рішення враховує випадки, про які ви пишете. З повагою
simhumileco

вибачте за неправильний текст! - проблема вашої відповіді полягає в тому, що вона також буде враховувати .і ..(що еквівалентно поточній та її папці, що містить). || але все ж відповідь у посиланні пояснює це далі та забезпечує рішення.
DJCrashdummy

2

Зверніть увагу , що є командний рядок трюк (працює, по крайней мере, ш , Баш і КШ ): Просто суфікс з каталогу з косою рисою. Це вилити вміст з з папок в в каталог ( як не дивно, я вперше дізнався про цю виверту , коли з допомогою 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

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

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

Я спробував трюк із заднім косою рисою, але це не спрацювало.


2

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

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

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

Зауважте, що вихідний шлях не закінчується символом/ (тому всі файли / каталоги та файли файлів копіюються)

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


1

Я бачив, що cp не завжди копіює приховані файли, і якщо ви хочете, щоб команда, яка, здається, працює у всіх діалектах Linux / unix, ви повинні спробувати використовувати:

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

-2

Щонайменше для K3b 2.0.3, є поле запитань, яке з'являється, коли доданий каталог до проекту, який запитує, чи потрібно включити приховані файли ... Є також питання, яке з'являється, щоб запитати про включення посилання. Гарні речі!


"поле запитань, яке спливе" - для команди оболонки (CLI)?
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.