Если у вас есть доступ к GNUgrep
(по умолчанию в Linux ), вы можете использовать для этого -z
:
-z, --null-data
Treat input and output data as sequences of lines, each terminated by a
zero byte (the ASCII NUL character) instead of a newline. Like the -Z or
--null option, this option can be used with commands like sort -z to
process arbitrary file names.
Это позволит вам указать шаблоны, которые охватывают несколько строк. Затем используйте -F
, чтобы шаблон не интерпретировался как регулярное выражение :
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings (instead of regular
expressions), separated by newlines, any of which is to be matched.
Наконец, сохраните строку поиска в переменной:
$ IFS='' read -r -d '' pat <<EoF
> class.function('--parameter','-p', type = lambda x: operation(x,"%Y-%m-%d").date(),
> default=unicode(previousTime-actualTime),
> help='Send help'
> )
> EoF
Чтобы запустить вышеуказанное, сначала напишите это в своем терминале:
IFS='' read -r -d '' pat <<EoF
Затем вставьте нужные строки и напишите EoF
. Если строка поиска не заканчивается новой строкой,нажмите Введите перед записью EoF
, так как это должно быть на отдельной строке.
Теперь вы можете grep
свои файлы:
grep -z "$pat" /path.to/files/*
Вышеупомянутое означает
Ключевые части вашего вопроса, по-видимому, следующие:
I only want to add a new snapshot when it is different to its predecessor. So although the script may run every 10 minutes, the gap between adjacent snapshots may be 40 minutes, or much longer
и
Is it possible for rsync, on a dry run or not, to report on files or directories deleted in the source relative to the link-dest
Насколько я понимаю, вы внедрили версию rsnapshot
, в которой каждый раз, когда вы решаете создать резервную копию, предыдущая папка резервной копии становится вашей директорией --link-dest
. Большая разница в том, что если между текущим исходным деревом и самой последней резервной копией нет изменений, то в вашем случае резервную копию делать не нужно.
В моем коротком эксперименте кажется возможным просто посмотреть на результатrsync
:если есть результат, значит нужно выполнить работу, а если нет, то нет. Ключевым моментом является просмотр непосредственно каталога ссылок
output=$(rsync -rti --delete --dry-run "$src/" "$lnk/" 2>&1 | grep -v '^[^*]d' | head -n1)
if [ -n "$output" ]
then
# Work to be done
rsync -rtiv --link-dest "$lnk/" "$src/" "$dst"
fi
На данный момент я исключил каталоги из теста, поэтому изменение каталога не вызовет резервного копирования. Если вам небезразличны и изменения каталогов, удалите фильтр grep
из теста
Это своего рода обходной путь, так как он использует Python. Я экспериментировал как с diff
, так и с rsync
большую часть дня. Я просто не могу заставить rsync
сообщать о файлах/каталогах, которые были удалены в источнике и присутствуют в местоположении link-dest
(, например. в пробном режиме ). diff
, кажется, выполняет свою работу, но может быть очень длинным с большими каталогами, и у вас нет возможности сказать «остановитесь, если вы обнаружите разницу». То же самое относится и к rsync
.
import filecmp
def same_folders(dcmp):
if dcmp.diff_files or dcmp.left_only or dcmp.right_only:
return False
for sub_dcmp in dcmp.subdirs.values():
if not same_folders(sub_dcmp):
return False
return True
if same_folders(filecmp.dircmp( source_dir, link_dest_dir_path )):
print( 'NO CHANGE' )
#... act accordingly
Первые эксперименты, кажется, показывают, что это невероятно быстрый способ найти разницу между двумя каталогами. Между прочим, я еще не изучал, какая разностная функция используется для создания dircmp.diff_files
(, которая перечисляет файлы с одинаковыми путями, но разными ).
left_only
и right_only
предназначены для поиска новых файлов/каталогов в источнике или тех, которые были удалены из источника, соответственно.
Это, очевидно, останавливает вторую секунду, когда находит различие.
Я знаю BASH намного меньше, чем Python... Интересно, возможен ли BASH, эквивалентный вышеизложенному? Тогда было бы интересно сравнить скорость...