Рекурсивно копіюючи приховані файли - Linux


19

Чи є простий спосіб рекурсивно копіювати всі приховані файли в каталозі в інший каталог? Я хотів би створити резервну копію всіх файлів налаштувань у домашньому каталозі, а не звичайних файлів. Я намагався:

cp -R .* directory

але він також розпізнає .та ..рекурсивно копіює всі не приховані файли. Чи є спосіб заставити cp ігнорувати .і ..?


Чи є різниця між -rі -R?
Чамінда Бандара

Відповіді:


15

Моїм улюбленим рухатись панами взагалі були:

tar cvf - . | (cd /dest/dir; tar xvf -)

який розірває поточний каталог для stdout, потім передає його в підрозділ, який перший CD-код, в каталог призначення, перш ніж untarring stdin. Простий, прямий, розширюваний - врахуйте, що станеться при заміні () на ssh на іншу машину. Або щоб відповісти на ваше запитання:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)

1
Спасибі, варіант виключення - це те, що мені потрібно. Я вже зробив це по-іншому, але зберіг би це для подальшого ознайомлення. Це здається справді гнучким (хоча може й повільніше).
Зіфре

1
Хороша порада. У мене є кілька вдосконалень: 1) Використання cd /dest/dir && tar xvf -. &&Чи зупинить вас від blatting по каталогу джерела , якщо у вас є помилка в пункті призначення. 2) Вам потрібен лише vпрапор дьогтю в одній з команд tar (або ні в одній).
Том Шоу

Справедливо. Мені також було відомо, що групувати речі іншим способом: скопіювати сюди віддалений srcdir, зробіть(cd /src/dir && tar cf - .) | tar xvf -
pjz

17

Майже кожен раз це можна вирішити лише за допомогою:

cp -R .[a-zA-Z0-9]* directory

Досить незвично мати прихований файл, який не починається з одного з цих символів.

Доступні інші відповідники зразка ( .??*, .[^.]*) - дивіться коментарі


Це ігнорує лише.-Xyz - матеріал у [] відповідає лише першому символу після крапки.
Гаміш Даунер

6
. [^.] * спіймав би все
falstro

1
... крім речей, що починаються з двох періодів.
falstro

@roe - це теж приємна версія
Alnitak

@mish - так, я сказала стільки ж у відповіді.
Альнітак

11

Ви можете використовувати rsync.

rsync -a ./ /some/other/directory/

який буде копіювати вміст поточного каталогу (включаючи крапкові файли, але не включаючи ..)


Простий і працює і для прихованих файлів у прихованих папках.
користувач59183

для мене це менш заплутане та найефективніше із запропонованих рішень
палердо

Приємне рішення. Мені це також знадобилося, щоб не копіювати по- .gitрізному. Додавання -C робить це так, і команда стає:rsync -aC ./ /some/other/directory/
theruss

10

Я благаю вас, крок від простого розширення оболонки в cpкомандному рядку - оболонка розширення має всі види гм . «Цікавих» кутові випадки (небажаних рекурсию , викликані і .., пробілу, недруковані речі, жорсткі посилання, символічні посилання, і і т. д.) findНатомість використовуйте (він поставляється в findutilsпакеті, якщо у вас його не встановлено - що було б дивно, усі дистрибутиви встановлюють його за замовчуванням):

find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;

Покрокове пояснення:

  • -Hпризведе до того, що findне слідкувати за посиланнями (за винятком випадків, коли фактичне ім'я каталогу топлерів, яке ви йому дали, є символьним посиланням; воно буде наступним.)
  • /path/to/toplevel/dir/ це, очевидно, повинно бути замінене вами шляхом створення каталогу, в якому розміщуються файли налаштувань і каталоги, які ви хочете створити резервну копію.
  • -maxdepth 1зупиниться findвід рекурсивного спуску в будь-які каталоги, назва яких починається з крапки. Нам не потрібно, щоб це повторювалося, cpзробимо це для нас, нам просто потрібні імена на цьому рівні.
  • -name '.*'говорить, findщо ми хочемо, щоб усі імена починалися з крапки. Це не працюватиме правильно, якщо встановлена ​​змінна середовище POSIXLY_CORRECT, але це рідко (якщо є). Це перша умова, яку ми вже вказали.
  • a \( ....... \)- це і супроводжується більш складною умовою в дужках (я використав ..... замінити його, це пояснено нижче.) Нам потрібно уникнути дужок, оскільки вони в іншому випадку будуть (неправильно) інтерпретуватися оболонкою, звідси зворотний нахил перед ними,
  • -type d -o -type f -o -type lє три умови з або між ними. -type dвідповідає каталогам, -type fвідповідає звичайним файлам та -type lвідповідає посиланням. Ви можете вибрати те, що хочете - наприклад, якщо ви не хочете створювати резервні копії каталогів налаштувань, опустіть -type d-oсправа за ним, очевидно.)
  • -exec ..... \;вказує findвиконувати команду щоразу, коли зустрічається збіг. Кінець команди позначений крапкою з комою, до якої нам знову потрібно відступити зворотною косою рисою, щоб уникнути інтерпретації оболонки. У цьому командному рядку вам потрібно використовувати {}там, де ви хочете, щоб ім'я наразі зустрічається матчу. Оскільки оболонки можуть також неправильно трактувати фігурні дужки, слід помістити їх у апострофи, як у '{}'. Команда, яку ми хочемо виконати в цьому випадку, є cp -a '{}' /path/to/destination/dir/(-означає, що архів, який повторюється у підкаталогах, копіює символьні посилання як посилання, зберігає дозволи та розширені атрибути, і /path/to/destination/dir/, очевидно, назва каталогів призначення - замініть його.)

Отже, простою англійською мовою цей findкомандний рядок говорить про це:

Почніть з / шлях / до / до верхнього рівня / реж /. Не спускайтеся в жодні підкаталоги. Знайдіть усі каталоги, файли та посилання, назва яких починається з крапки. Для кожного знайденого знайдіть, скопіюйте його в / шлях / до / місце призначення / dir / збереження природи, дозволів та розширених атрибутів.


1
знайти - це найкорисніше, що коли-небудь.
Містер Блискучий і Новий 安 宇

1
Гарна відповідь. Хоча я вважаю за краще -exec ... ';' Уникнення зворотної косої риси означає, що ця команда буде працювати як в CLI, так і в crontab :))
kubanczyk

8

Я завжди використовував. ?? * для пошуку прихованих файлів без отримання "". і "..". Можливо, це може пропустити ".a" або щось подібне, але я ніколи такого не маю.


напевно приємно і акуратно :) +1
falstro

Я не хочу, щоб він загадково провалився, якщо є якісь ".a"
Zifre

Мені це подобається, тому що якщо ви знаєте, що у вас немає жодних прихованих символів файлів, це дуже швидко набирати текст.
Пол Томблін

Це має бути найкращою відповіддю. Його слід підняти до верху.
Ібн Саїд

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