Подтвердить что ты не робот

Как выполнить rsync только определенный список файлов?

У меня около 50 или около того файлов в разных подкаталогах, которые я хотел бы нажать на удаленный сервер. Я решил, что rsync сможет сделать это для меня, используя опцию --include-from. Без опции --exclude = "*" все файлы в каталоге синхронизируются с опцией, без файлов.

rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ [email protected]:/var/www/ --dry-run

Я запускаю его как сухую, а 0.0.0.0 явно заменяется IP удаленного сервера. Содержимое rsync_include.txt представляет собой новый список относительных путей, разделенных строками, к файлам, которые я хочу загрузить.

Есть ли лучший способ сделать это, который ускользает от меня в понедельник утром?

4b9b3361

Ответ 1

У вас может быть более легкое время, если вы ищете конкретный список файлов, помещая их непосредственно в командной строке:

# rsync -avP -e ssh `cat deploy/rsync_include.txt` [email protected]:/var/www/

Это предполагает, однако, что ваш список не так длинный, что длина командной строки будет проблемой и что файл rsync_include.txt содержит только реальные пути (т.е. без комментариев и без регулярных выражений).

Ответ 2

Существует флаг --files-from, который делает именно то, что вы хотите. От man rsync:

--files-from=FILE

С помощью этой опции вы можете указать точный список файлов для передачи (как считанные из указанного FILE или - для стандартного ввода). Он также улучшает поведение rsync по умолчанию, чтобы упростить передачу только указанных файлов и каталогов:

  • подразумевается опция --relative (-R), которая сохраняет информацию о пути, указанную для каждого элемента в файле (используйте --no-relative или -no-R, если вы хотите повернуть это выключено).

  • Предполагается опция -dirs (-d), которая создаст каталоги, указанные в списке адресата, а не шумно пропуская их (используйте --no-dirs или -no-d, если вы хотите чтобы отключить это).

  • Поведение параметров -archive (-a) не подразумевает --recursive (-r), поэтому укажите его явно, если вы этого хотите.

  • Эти побочные эффекты изменяют состояние rsync по умолчанию, поэтому позиция опции -files-from в командной строке не влияет на то, как анализируются другие параметры (например, -a работает так же, как и раньше или после --files-from, равно как и -no-R и все остальные варианты).

Имена файлов, которые считываются из ФАЙЛА, относятся к исходному каталогу - все ведущие косые черты удаляются, а ссылки ".." не могут превышать исходный каталог. Например, возьмите эту команду:

rsync -a --files-from=/tmp/foo /usr remote:/backup

Если/tmp/foo содержит строку "bin" (или даже "/bin" ), каталог /usr/bin будет создан как /backup/bin на удаленном хосте. Если в нем содержится "bin/" (обратите внимание на конечную косую черту), сразу же будет отправлено немедленное содержимое каталога (без необходимости упоминания в файле - это началось в версии 2.6.4). В обоих Если опция -r была включена, то также будет передана полная иерархия (помните, что -r необходимо явно указывать с помощью -files-from, поскольку это не подразумевается -a). Также обратите внимание, что эффект (включен по умолчанию) - относительная опция заключается в дублировании только информации о пути, которая считывается из файла - это не приводит к дублированию пути источника-спецификации (в этом случае /usr ).

Кроме того, файл -files-from может быть прочитан с удаленного хоста вместо локального хоста, если вы укажете "host:" перед файлом (хост должен соответствовать одному концу передачи). В качестве краткой вы можете указать только префикс ":" означает "использовать удаленный конец передачи". Например:

rsync -a --files-from=:/path/file-list src:/ /tmp/copy

Это скопирует все файлы, указанные в файле /path/file -list, расположенном на удаленном хосте src.

Если указаны опции --iconv и --protect-args, а файлы файлы - от имени файла отправляются с одного хоста на другой, имена файлов будут переводиться с передающей хост-системы на хостсет принимающих хостов.

ПРИМЕЧАНИЕ. Сортировка списка файлов на входе -files-from помогает rsync быть более эффективным, так как это позволит избежать повторного посещения элементов пути, которые разделяются между соседними элементами. Если вход не отсортирован, некоторые элементы пути (подразумеваемые каталоги) могут в конечном итоге сканироваться несколько раз, а rsync в конечном итоге будет их размножать после они превращаются в элементы списка файлов.

Ответ 3

Параметр

--files-from= требует конечной косой черты, если вы хотите сохранить абсолютный путь неповрежденным. Таким образом, ваша команда станет примерно такой:

rsync -av --files-from=/path/to/file / /tmp/

Это можно сделать, как есть большое количество файлов, и вы хотите скопировать все файлы в x-путь. Таким образом, вы можете найти файлы и вывести вывод в файл, как показано ниже:

find /var/* -name *.log > file

Ответ 4

Для справки, ни один из ответов выше не помог, кроме одного. Подводя итог, вы можете выполнить операцию резервного копирования, используя --files-from=, используя либо:

 rsync -aSvuc 'cat rsync-src-files' /mnt/d/rsync_test/

ИЛИ ЖЕ

 rsync -aSvuc --recursive --files-from=rsync-src-files . /mnt/d/rsync_test/

Первая команда не требует пояснений, кроме содержимого файла rsync-src-files который я подробно опишу ниже. Теперь, если вы хотите использовать последнюю версию, вы должны иметь в виду следующие четыре замечания:

  1. Обратите внимание, что нужно указать как --files-from и исходный каталог.
  2. Нужно явно указать --recursive.
  3. Файл rsync-src-files представляет собой файл, созданный пользователем, и он был помещен в каталог src для этого теста.
  4. rsyn-src-files содержат файлы и папки для копирования, и они взяты относительно исходного каталога. ВАЖНО: убедитесь, что в файле нет завершающих пробелов или пустых строк. В приведенном ниже примере есть только две строки, а не три (выясните это случайно). Содержимое rsynch-src-files:

folderName1
folderName2

Ответ 5

Я получил похожую задачу: rsync все файлы, измененные после указанной даты, но исключая некоторые каталоги. Было сложно создать единый стиль "все в одном", поэтому я разбил задачу на более мелкие части. Окончательное решение:

find  ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | egrep -v "/\..|Downloads|FOO" > FileList.txt
rsync -v --files-from=FileList.txt ~/sourceDIR /Destination

Сначала я использую find -L ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS". Я пытался добавить regex в строку find, чтобы исключить шаблоны имен, однако мой вкус швов Linux (Mint) не позволяет понять отрицательное регулярное выражение в find. Пробовал количество регулярных выражений - не работает по желанию. В итоге я получаю опцию egrep -v, которая исключает паттерны простым способом. Мой rsync не копирует каталоги, такие как /.cache или/.config плюс некоторые другие, которые я явно назвал.

Ответ 6

Этот ответ не является прямым ответом на вопрос. Но это должно помочь вам понять, какое решение лучше всего подходит для вашей проблемы.

При анализе проблемы вы должны активировать опцию отладки -vv

Затем rsync выведет, какие файлы включены или исключены по какому шаблону:

building file list ... 
[sender] hiding file FILE1 because of pattern FILE1*
[sender] showing file FILE2 because of pattern *

Ответ 7

$ date
  Wed 24 Apr 2019 09:54:53 AM PDT
$ rsync --version
  rsync  version 3.1.3  protocol version 31
  ...

Синтаксис: rsync <file_/_folder_list> <source> <target>

Имена папок (здесь, с обучением /; например, Cancer - Evolution/) находятся в файле списка папок (например: cm_folder_list_test):

# /mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test
# test file: 2019-04-24
Cancer/
Cancer - Evolution/
Cancer - Genomic Variants/
Cancer - Metastasis (EMT Transition ...)/
Cancer Pathways, Networks/
Catabolism - Autophagy; Phagosomes; Mitophagy/
Catabolism - Lysosomes/

Если вы не включите эти конечные символы /, целевые папки rsync будут созданы, но будут пустыми.

Эти имена папок добавляются к остальной части их пути (/home/victoria/Mail/2_RESEARCH - NEWS), обеспечивая тем самым полный путь к папке rsync; Например: /home/victoria/Mail/2_RESEARCH - NEWS/Cancer - Evolution/.

Обратите внимание, что вам также нужно использовать --files-from=..., НЕ --include-from=...

rsync -aqP --delete --files-from=/mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test "/home/victoria/Mail/2_RESEARCH - NEWS" $IN/

(В моем BASH-скрипте я определил переменную $IN следующим образом.)

BASEDIR="/mnt/Vancouver/projects/ie/claws"
IN=$BASEDIR/data/test/input

Используемые параметры rsync:

 -a  :   archive: equals -rlptgoD (no -H,-A,-X)
    -r  :   recursive
    -l  :   copy symlinks as symlinks
    -p  :   preserve permissions
    -t  :   preserve modification times 
    -g  :   preserve group 
    -o  :   preserve owner (super-user only) 
    -D  :   same as --devices --specials 
  -q  :   quiet (https://serverfault.com/info/547106/run-totally-silent-rsync)

  --delete
    This  tells  rsync to delete extraneous files from the RECEIVING SIDE (ones
    that ARENT ON THE SENDING SIDE), but only for the directories that are
    being synchronized.  You must have asked rsync to send the whole directory
    (e.g.  "dir" or "dir/") without using a wildcard for the directorys contents
    (e.g. "dir/*") since the wildcard is expanded by the shell and rsync thus
    gets a request to transfer individual files, not the files parent directory.
    Files  that  are  excluded  from  the transfer are also excluded from being
    deleted unless you use the --delete-excluded option or mark the rules as
    only matching on the sending side (see the include/exclude modifiers in the
    FILTER RULES section).  ...