rsync не сообщает о файлах для удаления

Если у вас есть доступ к 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/*

Вышеупомянутое означает

0
26.02.2021, 12:08
2 ответа

Ключевые части вашего вопроса, по-видимому, следующие:

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из теста

.
0
18.03.2021, 22:28

Это своего рода обходной путь, так как он использует 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, эквивалентный вышеизложенному? Тогда было бы интересно сравнить скорость...

0
18.03.2021, 22:28

Теги

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