Як скопіювати за допомогою 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.