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

<p>у меня есть около 50 или около того файлов в различных подкаталогах, которые я хотел бы отправить на удаленный сервер. я подумал, что rsync сможет сделать это для меня, используя опцию --include-from. без параметра --exclude = "*" все файлы в каталоге синхронизируются, с параметром - нет файлов.</p><pre><code>rsync -avp -e ssh --include-from=deploy/rsync\_include.txt --exclude=* ./ root@0.0.0.0:/var/www/ --dry-run </code></pre><p>я запускаю его как сухой изначально, и 0.0.0.0, очевидно, заменяется ip удаленного сервера. содержимое rsync\_include.txt представляет собой список строк, разделенных новой строкой, относительно относительных путей к файлам, которые я хочу загрузить.</p><p>есть ли лучший способ сделать это, чтобы избежать меня в понедельник утром?</p>

<p>возможно, вам будет проще, если вы ищете определенный список файлов, вместо этого поместив их прямо в командную строку:</p><pre><code># rsync -avp -e ssh `cat deploy/rsync\_include.txt` root@0.0.0.0:/var/www/ </code></pre><p>это предполагает, однако, что ваш список не такой длинный, что длина командной строки будет проблемой, и что файл <code>rsync\_include.txt</code> содержит только реальные пути (то есть без комментариев и без регулярных выражений).</p>

<p>есть флаг <code>--files-from</code>, который делает именно то, что вы хотите. от <code>man rsync</code>:</p><blockquote> <pre><code>--files-from=file </code></pre> <p>использование этой опции позволяет вам указать точный список файлов для передачи (как прочитано из указанного файла или - для стандартного ввода). он также настраивает стандартное поведение rsync, чтобы упростить передачу только указанных файлов и каталогов:</p> <ul> <li><p>подразумевается опция --relative (-r), которая сохраняет информацию о пути, которая указана для каждого элемента в файле (используйте --no -lative или --no-r, если вы хотите отключить это).</p></li> <li><p>подразумевается опция --dirs (-d), которая создает каталоги, указанные в списке в месте назначения, а не пропускает их с шумом (используйте --no-dirs или --no-d, если вы хотите отключить это).</p></li> <li><p>поведение параметра --archive (-a) не подразумевает --recursive (-r), поэтому укажите его явно, если хотите.</p></li> <li><p>эти побочные эффекты изменяют состояние по умолчанию rsync, поэтому положение параметра --files-from в командной строке не влияет на то, как анализируются другие параметры (например, -a работает одинаково до или после --files- из, как делает --no-r и все другие варианты).</p></li> </ul> <p>все имена файлов, которые читаются из файла, относятся к исходному каталогу - все начальные слэши удаляются, и никакие ссылки ".." не могут идти выше, чем исходный каталог. например, возьмите эту команду:</p> <pre><code>rsync -a --files-from=/tmp/foo /usr remote:/backup </code></pre> <p>если/tmp/foo содержит строку «bin» (или даже «/ bin»), каталог/usr/bin будет создан как/backup/bin на удаленном хосте. если он содержит «bin /» (обратите внимание на косую черту), будет также отправлено непосредственное содержимое каталога (без необходимости явного упоминания в файле - это началось в версии 2.6.4). в обоих в случаях, если включена опция -r, вся иерархия dir также будет перенесена (имейте в виду, что -r нужно явно указывать с помощью --files-from, так как она не подразумевается в -a). также обратите внимание, что эффект (включен по умолчанию) --relative заключается в дублировании только информации о пути, которая читается из файла - it не вызывает дублирование пути спецификации источника (в данном случае/usr).</p> <p>кроме того, файл --files-from может быть прочитан с удаленного хоста вместо локального хоста, если перед файлом указан «host:» (хост должен соответствовать одному концу передачи). для краткости вы можете указать только префикс «:», что означает «использовать удаленный конец передачи». например:</p> <pre><code>rsync -a --files-from=:/path/file-list src:/ /tmp/copy </code></pre> <p>это скопировало бы все файлы, указанные в файле/path/file-list, который находился на удаленном хосте "src".</p> <p>если указаны параметры --iconv и --protect-args и имена файлов --files-from отправляются с одного хоста на другой, имена файлов будут транслироваться из кодировки отправляющего хоста в кодировку принимающего хоста.</p> <p>примечание: сортировка списка файлов во входных данных --files-from помогает rsync быть более эффективным, так как это позволит избежать повторного посещения элементов пути, которые совместно используются смежными записями. если входные данные не отсортированы, некоторые элементы пути (подразумеваемые каталоги) могут в конечном итоге сканироваться несколько раз, и rsync в конечном итоге удалит их после они превращаются в элементы списка файлов.</p> </blockquote>

<p>параметр <code>--files-from=</code> требует косой черты, если вы хотите сохранить абсолютный путь без изменений. таким образом, ваша команда станет примерно такой:</p><pre><code>rsync -av --files-from=/path/to/file / /tmp/ </code></pre><p>это можно сделать, если существует большое количество файлов, и вы хотите скопировать все файлы по пути x. таким образом, вы найдете файлы и выбросите вывод в файл, как показано ниже:</p><pre><code>find /var/* -name *.log > file </code></pre>

<p>для справки, ни один из ответов выше не помог, кроме одного. подводя итог, вы можете выполнить операцию резервного копирования, используя <code>--files-from=</code>, используя:</p><pre> rsync -asvuc `cat rsync-src-files` /mnt/d/rsync\_test/ </pre><p>или же </p><pre> rsync -asvuc --recursive --files-from = rsync-src-files. /mnt/d/rsync\_test/ </pre><p>первая команда не требует пояснений, кроме содержимого файла <code>rsync-src-files</code>, который я подробно опишу ниже. теперь, если вы хотите использовать последнюю версию, вы должны иметь в виду следующие четыре замечания:</p><ol> <li>обратите внимание, что нужно указать и <code>--files-from</code>, и<em> source </em>каталог</li> <li>нужно явно указать <code>--recursive</code>. </li> <li>файл <code>rsync-src-files</code> - это файл, созданный пользователем, и он был помещен в каталог src для этого теста</li> <li><code>rsyn-src-files</code> содержит файлы и папки для копирования, и они взяты относительно исходного каталога. важно! убедитесь, что в файле нет завершающих пробелов или пустых строк. в приведенном ниже примере есть только две строки, а не три (выясните это случайно). содержимое <code>rsynch-src-files</code>:</li> </ol><p>foldername1<br> foldername2</p>

<pre><code>$ date wed 24 apr 2019 09:54:53 am pdt $ rsync --version rsync version 3.1.3 protocol version 31 ... </code></pre><p>синтаксис: <code>rsync <file\_/\_folder\_list> <source> <target></code></p><p><em> папка </em>имена (здесь, с обучающим <code>/</code>; например, <code>cancer - evolution/</code>) находятся в файле списка папок (например, cm\_folder\_list\_test):</p><pre><code># /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/ </code></pre><p>если вы не включите эти конечные <code>/</code>, целевые папки rsync будут созданы, но они будут пустыми.</p><p>эти имена папок добавляются к остальной части их пути (<code>/home/victoria/mail/2\_research - news</code>), обеспечивая тем самым полный путь к папке rsync; например: <code>/home/victoria/mail/2\_research - news/cancer - evolution/</code>.</p><p>обратите внимание, что вам также нужно использовать <code>--files-from=</code> ..., не <code>--include-from=</code> ...</p><p><code>rsync -aqp --delete --files-from=/mnt/vancouver/projects/ie/claws/data/cm\_folder\_list\_test "/home/victoria/mail/2\_research - news" $in/(в моем bash-скрипте я определил переменную $in</code> следующим образом.)</p><pre><code>basedir="/mnt/vancouver/projects/ie/claws" in=$basedir/data/test/input </code></pre><p><strong> используемые опции rsync: </strong></p><pre><code> -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). ... </code></pre>

<p><em> этот ответ не является прямым ответом на вопрос . но он должен помочь вам выяснить, какое решение лучше всего подходит для вашей проблемы. </em></p><p>при анализе проблемы вы должны активировать опцию отладки <code>-vv</code></p><p>затем rsync выведет, какие файлы включены или исключены по какому шаблону:</p><pre><code>building file list ... [sender] hiding file file1 because of pattern file1* [sender] showing file file2 because of pattern * </code></pre>