it-swarm.xyz

Как 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 представляет собой список строк, разделенных новой строкой, относительно относительных путей к файлам, которые я хочу загрузить.

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

55
Dan Steele

Возможно, вам будет проще, если вы ищете определенный список файлов, вместо этого поместив их прямо в командную строку:

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

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

3
Wes Hardaker

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

--files-from=FILE

Использование этой опции позволяет вам указать точный список файлов для передачи (как прочитано из указанного ФАЙЛА или - для стандартного ввода). Он также настраивает стандартное поведение rsync, чтобы упростить передачу только указанных файлов и каталогов:

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

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

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

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

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

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

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

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

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

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

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

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

145
atp

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

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

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

find /var/* -name *.log > file
8
Waqas Khan

Для справки, ни один из ответов выше не помог, кроме одного. Подводя итог, вы можете выполнить операцию резервного копирования, используя --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, и source каталог
  2. Нужно явно указать --recursive
  3. Файл rsync-src-files - это файл, созданный пользователем, и он был помещен в каталог src для этого теста
  4. rsyn-src-files содержит файлы и папки для копирования, и они взяты относительно исходного каталога. ВАЖНО! Убедитесь, что в файле нет завершающих пробелов или пустых строк. В приведенном ниже примере есть только две строки, а не три (выясните это случайно). Содержимое rsynch-src-files:

folderName1
FolderName2

3
K F
$ 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/questions/547106/run-totally-silent-rsync)

  --delete
    This  tells  rsync to delete extraneous files from the RECEIVING SIDE (ones
    that AREN’T 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 directory’s 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).  ...
0
Victoria Stuart

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

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

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

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