Как исключить подстановочный каталог, но включить подстановочные файлы, используя rdiff-backup?
Я использую rdiff-backup. Действительно потрясающий простой мощный инструмент резервного копирования. Однако я борюсь с шаблонами с подстановочными знаками. У меня есть эта структура каталогов:
/data/aaa/cache
/data/bbb/cache
/data/ccc/cache
etc....
В каждом каталоге кеша находятся оригинальные файлы и файлы кеша. Оригинальные файлы названы просто 1.jpg
, 2.png
, 3.gif
, и так далее. Файлы кэша имеют некоторую строку, прикрепленную к исходному имени файла.
Поэтому я хочу сделать резервную копию всех каталогов /data/*/cache, но включить только оригинальные файлы, а не файлы кэша.
Я использую эту команду:rdiff-backup --exclude **/cache --include **/cache/+([0-9]).+([a-z]) /data /backup
Но rdiff-backup возвращает это, и я потерян:
Found interrupted initial backup. Removing...
Fatal Error: Last selection expression:
Command-line include glob: **/cache/+([0-9]).+([a-z])
only specifies that files be included. Because the default is to
include all files, the expression is redundant. Exiting because this
probably isn't what you meant.
2 ответа
С http://rdiff-backup.nongnu.org/rdiff-backup.1.html:
A given file is excluded by the file selection system exactly
when the first matching file selection condition
specifies that the file be excluded; otherwise the file is included.
...
For instance,
rdiff-backup --include /usr --exclude /usr /usr /backup
is exactly the same as
rdiff-backup /usr /backup
because the include and exclude directives match exactly the same
files, and the --include comes first, giving it precedence.
Так что, в вашем случае, это жалуется на финал --include
потому что, если файл попадает туда (то есть он не соответствует предыдущему --exclude
) оно будет включено, соответствует ли оно --include
, Вот что пыталось сказать сообщение об ошибке.
Что касается того, как достичь своей цели...
Предполагая, что вы хотите исключить только пути формы: /data/*/cache/[0-9]*.[a-z][a-z][a-z]?*
просто укажите, что:
rdiff-backup --exclude '/data/*/cache/[0-9]*.[a-z][a-z][a-z]?*' --exclude '*' /data /backup
Это должно работать (я не проверял это).
Вы можете сделать два шага:
- создайте список всех файлов, которые вы хотите исключить, например, с помощью find . -name "**/cache" > exclude.lst
- используйте список с --exclude-filelist exclude.lst
Таким образом, вы можете избежать борьбы с опцией glob, и у вас будет полный контроль над вашими исключениями