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