У меня есть текстовый файл, содержащий список каталогов с его абсолютным путем
$ cat DirectoriesToCopy.txt
/data/Dir1
/data/Dir2
Я хочу использовать rsync для копирования всех этих каталогов, сохраняя его абсолютный путь в другое место.
Я попробовал следующую команду rsync, но она не работает
rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*' / /media/MyDestination/
Что здесь не так?
/data/Dir1
и/data/Dir2
включить их содержимое в/media/MyDestination/Dir1
и/media/MyDestination/Dir2
? Или вы хотите включить/data
часть? Насколько велик этот список, он слишком велик, чтобы просто перечислять эти записи в командной строке? Во всяком случае, ваши--exclude
заявления не позволяют рекурсии./media/MyDestination/data/Dir2/
. Я добавил --exclude, чтобы предотвратить копирование других каталогов и файлов в /.rsync -av $(cat DirectotiesToCopy.txt) /media/MyDestination/
Ответы:
Используйте следующую команду:
Вам нужно явно указать / data /, вы могли бы также добавить это в список в файле. Затем исключите все остальные каталоги (порядок важен для включений / исключений).
Обратите внимание, что ваше использование
-r
было излишним, поскольку оно включено в-a
.РЕДАКТИРОВАТЬ: Вы также можете достичь того же результата с:
Это не rsync, который заставляет вас делать сложные вещи, просто скопировать пару каталогов, он просто дает вам несколько способов сделать то же самое; в некоторых случаях путь включения / исключения может быть более подходящим, в данном случае я бы выполнил --relative вещь выше (без
--relative
того, чтобы вы в конечном итоге/media/MyDestination/Dir1
и/media/MyDestination/Dir2
с,--relative
весь путь источника копируется к месту назначения).источник
rsync -av --relative $(cat DirectotiesToCopy.txt) /media/MyDestination/
--relative
это просто еще один вариант.Не используйте
--include
или--filter
вариации, так как это только запутает вещи. Вместо этого используйте--files-from=_filename_
. (Если вы делаете, убедитесь, что вы делаете много испытаний.)Создайте список каталогов в файле, один каталог / файл на строку.
Используйте rsync
--files-from=
с указанным выше файлом.Используйте параметр
--relative
/,-R
чтобы убедиться, что исходные пути скопированы в конец места назначения.Даже если у вас есть
-a
возможность, также включите-r
. Со страницы руководства:Завершить команду:
(файлы в list_of_files.txt должны быть относительными или находиться в директории верхнего уровня )
(если установлен DEBUG, rsync просто распечатывает то, что могло быть скопировано.)
источник
--include-from
также будет работать, но то, о чем я говорил,-r
в значительной степени не имеет значения.Руководство rsync предупреждает об этом сценарии (раздел «Включить / исключить правила шаблона»):
В вашем случае, я думаю , самый простой подход был бы препроцессировать список каталогов , которые включают в себя так , что всякий раз , когда вы включаете
/path/to/foo
, вы также включают в себя все родительские каталоги (/path/to
,/path
,/
), а также включать подкаталоги исходных каталогов (/path/to/foo/***
), и после того, как на все это есть правило, исключающее все, что ранее не перечислялось (*
).источник