Я благаю вас, крок від простого розширення оболонки в 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 / збереження природи, дозволів та розширених атрибутів.
-rі-R?