Принятие их является этими только двумя путями, "Удаляют Успешный", может войти в журнал, почему не только используют определенную математику?
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 ))
Используйте следующую команду:
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
, с -относительной
весь путь источника копируется в место назначения).
Руководство 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/
Я хочу использовать rsync для копирования всех этих каталогов [из списка], сохраняя его абсолютный путь в другое место
Не используйте --include
или --filter
вариации, так как это просто запутает вещи. Вместо этого используйте --files-from=_filename_
. (Если вы это сделаете, то обязательно сделайте -лоты тестирования.)
-создайте список каталогов в файле, по одному каталогу/файлу на строку.
Используйте rsync -файлы-from=
с указанным выше файлом.
Используйте опцию -отношение
/ -R
, чтобы убедиться, что исходные патнамы скопированы в конце назначения.
Даже при наличии опции -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 просто распечатывает то, что могло быть скопировано)
.