Intereting Posts
Динамики не отключаются после отключения звука Удалять все, кроме нескольких строк, через несколько файлов Замена в VIM с неизменной регулярной выраженной частью Есть ли Lubuntu, Centos equvialent … Centos, который запускает lxde из коробки? Почему bash не расширяет эту переменную, если я префикс команды с назначением одноразовой переменной Загрузка Apache PHP – права собственности и разрешения Правила Udev для устройства с несколькими интерфейсами Доступ запрещен для определенного пользователя с помощью настройки учетной записи PAM привязка ключа режима vi только в обычном режиме Пакет Debian не устанавливает элементы в / usr / src? Передача данных в stdin процесса без возникновения EOF впоследствии Безопасно ли заставлять fdisk использовать границу сектора 63? Запрос пароля во время загрузки с помощью службы systemd Найти все файлы с Python Shebang Поиск mp3-коллекции для песен с определенной длиной песни

rsync список каталогов с абсолютным путем в текстовом файле

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

$ cat DirectoriesToCopy.txt /data/Dir1 /data/Dir2 

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

Я попробовал следующую команду rsync, но она не работает

 rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*' / /media/MyDestination/ 

Что здесь происходит?

Используйте следующую команду:

 rsync -av --include-from=DirectoriesToCopy.txt --include /data/ --exclude='/data/*' --exclude='/*/' / /media/MyDestination/ 

Вам нужно включить / data / явно, вы также можете добавить это в список в файле. Затем исключить все другие каталоги (порядок важен с включением / исключением).

Обратите внимание, что использование -r было избыточным, поскольку оно включено в -a .

EDIT: вы также можете выполнить тот же результат:

 rsync -av --relative /data/Dir1 /data/Dir2 /media/MyDestination/ 

Это не rsync, который заставляет вас делать сложные вещи только для копирования нескольких каталогов, это просто дает вам несколько способов сделать то же самое; в некоторых случаях переход на include / exclude может быть более подходящим, здесь я бы сделал вышеописанную вещь (безрезультатно, в --relative вы получите /media/MyDestination/Dir1 и /media/MyDestination/Dir2 , с --relative весь исходный путь копируется в пункт назначения).

Я хочу использовать rsync для копирования всех этих каталогов [из списка], сохраняя свой абсолютный путь в другое место

Не используйте варианты --filter или --filter , так как это просто путает вещи. Вместо этого используйте --files-from=_filename_ . (Если вы это сделаете, убедитесь, что вы много тестируете.)

  1. Создайте список каталогов в файле, один каталог / файл в строке.

  2. Используйте rsync's --files-from= с указанным выше файлом.

  3. Используйте параметр --relative / -R чтобы убедиться, что исходные --relative путей скопированы в конце адресата.

  4. Даже если у вас есть опция -a , также -r . На странице руководства:

    В обоих случаях, если включена опция -r, будет также передана вся иерархия dir (помните, что -r необходимо явно указывать с помощью -files-from, поскольку это не подразумевается -a).

Полная команда:

 rsync ${DEBUG:+-nv} -arR --files-from=<list_of_files.txt> <top-level-dir> <target-dir> 

(файлы в list_of_files.txt должны быть относительными или найдены в верхнем уровне-dir )

(если установлен DEBUG, rsync просто распечатывает то, что могло быть скопировано.)

Руководство rsync предупреждает об этом сценарии (раздел «Включить / исключить правила шаблонов»):

это не сработает:

 + /some/path/this-file-will-not-be-found + /file-is-included - * 

Это терпит неудачу, поскольку родительский каталог "some" исключается правилом '*' , поэтому rsync никогда не посещает ни один из файлов в "some" или "some/path" каталогах. Одним из решений является запрос включения всех каталогов в иерархии с помощью одного правила: "+ */" (помещать его где-то перед правилом "- *" ) и, возможно, использовать --prune-empty-dirs , Другим решением является добавление определенных правил включения для всех родительских директорий, которые необходимо посетить. Например, этот набор правил отлично работает:

 + /some/ + /some/path/ + /some/path/this-file-is-found + /file-also-included - * 

В вашем случае я считаю, что самым простым подходом было бы предварительное перепрограммирование списка каталогов для включения, так что всякий раз, когда вы включаете /path/to/foo , вы также включаете все родительские каталоги ( /path/to , /path , / ), а также включают подкаталоги исходных каталогов ( /path/to/foo/*** ), и после всего этого есть правило, исключающее все ранее не перечисленные ( * ).

 <DirectoriesToCopy.txt awk ' {print "+ " $0 "/***"; while (sub(/\/+[^/]+\/*$/, "/")) print "+ " $0} END {print "- *"} ' >rsync-rules.txt rsync -avr --include-from=rsync-rules.txt / /media/MyDestination/