Я хочу переместить некоторое подмножество файлов из dirA в dirB (скажем, файлы с именем «blah» в имени файла), но я хочу, чтобы все вложенные каталоги были одинаковыми в новом месте. Как я могу это сделать?
Я хочу переместить некоторое подмножество файлов из dirA в dirB (скажем, файлы с именем «blah» в имени файла), но я хочу, чтобы все вложенные каталоги были одинаковыми в новом месте. Как я могу это сделать?
Ответы:
Магия rsync
правил фильтрации:
$ rsync -av --filter="+ */" --filter="-! *blah*" /source /dest
Обратитесь к rsync
странице справочника за подробной информацией о правилах фильтрации, но вот сокращенная версия для этой конкретной потребности.
--filter="+ */"
означает «включить все, что является каталогом»
--filter="-! *blah*
означает «исключить все, что не включает бла в имени файла»
Если вам нужно скопировать эти файлы, cp сделает:
cd dirA
find . -iname "*blah*" | xargs -If cp --parents f dirB
Опция --parents
сохраняет подкаталоги - она создает полный путь к каталогу для места назначения.
Это сработало для меня:
rsync -ave 'ssh -p 22' --filter="+ */" --exclude="*_blah.blah" uid@555.55.555.55:/source/directory/ /destination/directory/
В -e
коммутаторе определяет rsync
протокол передачи с портом в качестве -p 22
. Кроме того, конечные /
слэши важны, чтобы программа знала, что имеет дело с каталогами.
Спасибо @pdo за дополнительные часы в мой рабочий день!