Возможно, вы могли бы сделать это, используя вместо этого список шаблонов включения, и использовать --delete-excluded
(что соответствует названию)? Что-то вроде:
rsync -r --include-from=<patternlistfile> --exclude=* --delete-excluded / dest/
Если имена файлов могут содержать символы подстановки (*
, ?
и [
), то вам может потребоваться изменить Python, чтобы экранировать их:
re.sub("([[*?])", r"\\\1", "abc[def*ghi?klm")
Редактировать: Сопоставление на основе шаблонов работает несколько иначе, чем --files-from
, поскольку rsync
не будет переходить в каталоги, которые соответствуют шаблону исключения, из соображений эффективности. Так что если ваши файлы находятся в /some/dir
и /some/other/dir
, тогда ваш файл шаблона должен выглядеть следующим образом:
/some/
/some/dir/
/some/dir/file1
/some/dir/file2
/some/other/
/some/other/dir/
/some/other/dir/file3
...
В качестве альтернативы, если все файлы находятся в одном каталоге, вы можете слегка переписать команду:
rsync -r --include-from=<patternlistfile> --exclude=* --delete-excluded /some/dir/ dest/
и тогда ваши шаблоны станут:
/file1
/file2
Редактировать: Думая об этом, вы можете включить все каталоги с одним шаблоном:
/**/
но тогда вы получите все дерево каталогов в dest/
, что, вероятно, не то, что вам нужно. Но объединение его с -m
(который удаляет пустые каталоги) должно решить эту проблему - поэтому команда в конечном итоге выглядит примерно так:
rsync -m -r --delete-excluded --include-from=<patternfile> --exclude=* / dest/
и файл шаблона:
/**/
/some/dir/file1
/some/other/dir/file3