rsync список каталогов с полным путем в текстовом файле

Принятие их является этими только двумя путями, "Удаляют Успешный", может войти в журнал, почему не только используют определенную математику?

SUCCESS=$(grep 'Delete Successful' | wc -l)
POLICY_COUNT=$(grep 'Prepare to delete policy X' | wc -l)
POLICY_FAIL=$(grep 'Failed to delete policy X' | wc -l)
POLICY_SUCCESS=$(( $POLICY_COUNT - $POLICY_FAIL ))
ROLE_SUCCESS=$(( $SUCCESS - $POLICY_SUCCESS ))
8
17.12.2014, 15:47
3 ответа

Используйте следующую команду:

rsync -av --include-from=DirectoriesToCopy.txt --include /data/ --exclude='/data/*' --exclude='/*/' / /media/MyDestination/

Вам нужно явно включить /data/, вы также могли бы добавить его в список в файле. Затем исключите все остальные каталоги (порядок важен с включением/исключением).

Обратите внимание, что использование -r было избыточным, так как это включено в -a.

EDIT: Вы также можете достичь того же результата:

rsync -av --relative /data/Dir1 /data/Dir2 /media/MyDestination/

Это не rsync, который заставляет вас делать трудные вещи, просто скопировать пару каталогов, он просто дает вам несколько способов делать одно и то же; в некоторых случаях путь include/exclude может быть более подходящим, здесь я бы сделал -относительную вещь выше (без -относительную вы бы закончили с /средствами массовой информации/назначением источника/другой1 и /средствами массовой информации/назначением источника/другой2, с -относительной весь путь источника копируется в место назначения).

6
27.01.2020, 20:10

Руководство RSYNC предупреждает об этом сценарии (раздел «включать / исключать правила шаблона»):

Это не будет работать:

 + / некоторые / путь / этот файл-файл  - не найдено
 + / файл - включен
 - *
 

Это не удается, потому что родительский каталог «Некоторые» исключается правилом '*' , поэтому rsync никогда не посещает любой из файлов в «Некоторые» или «Некоторые / путь» каталоги. Одно решение состоит в том, чтобы просить всех каталогов в иерархии быть включенным с использованием единого правила: «+ * /» (поставить его где-то до правила »- *« ), И, возможно, используйте опцию - Prune-Publy-Dirs . Другое решение состоит в том, чтобы добавить конкретные включения правил для всех родителей, которые необходимо посетить. Например, этот набор правил работает нормально:

 + / некоторые /
 + / некоторые / путь /
 + / какой-то / путь / этот файл - найдено
 + / файл - также включен
 - *
 

В вашем случае, я думаю, что самый простым подходом будет предпронять список каталогов, чтобы включить так, чтобы всякий раз, когда вы включаете / Path / to / foo , вы также включите все родительские каталоги ( / Путь / к , / Путь , / ), а также включает подкаталогии оригинальных каталогов ( / Путь / к / foo / *** ), А ведь это имеет правило, которое исключает все не ранее перечисленное ( * ).

<DirectoriesToCopy.txt awk '
    {print "+ " $0 "/***"; while (sub(/\/+[^\/]+\/*$/, "/")) print "+ " $0}
    END {print "- *"}
' >rsync-rules.txt
rsync -avr --include-from=rsync-rules.txt  /  /media/MyDestination/
2
27.01.2020, 20:10

Я хочу использовать rsync для копирования всех этих каталогов [из списка], сохраняя его абсолютный путь в другое место

Не используйте --include или --filter вариации, так как это просто запутает вещи. Вместо этого используйте --files-from=_filename_. (Если вы это сделаете, то обязательно сделайте -лоты тестирования.)

  1. -создайте список каталогов в файле, по одному каталогу/файлу на строку.

  2. Используйте rsync -файлы-from= с указанным выше файлом.

  3. Используйте опцию -отношение / -R, чтобы убедиться, что исходные патнамы скопированы в конце назначения.

  4. Даже при наличии опции -a включите также -r. Из man-страницы:

    В обоих случаях, если опция -r включена, то будет передана и вся иерархия dir (имейте в виду, что -r должно быть явно указано с помощью --files-from, так как это не подразумевается опцией -a).

Полная команда:

rsync ${DEBUG:+-nv} -arR --files-from=<list_of_files.txt> <top-level-dir>  <target-dir>

(файлы в list_of_files.txt должны быть относительными или находиться в top-level-dir)

(если DEBUG установлен, rsync просто распечатывает то, что могло быть скопировано)

.
7
27.01.2020, 20:10

Теги

Похожие вопросы