Как rsync каталог в новый каталог с другим именем?

49

Я делаю передачу данных, старая файловая система глубоко опирается на каталог, который сейчас находится по другому пути. Это каталог git, в котором хранится код онлайн. Я не имею права перемещать или переименовывать его.

Так что я могу сделать это rsync этот каталог по тому же старому пути. Но имя каталога также изменилось.

Есть ли простой способ, которым я могу rsync каталог в целевой каталог с другим именем?

Zen
источник

Ответы:

83

Если вы хотите использовать rsyncдля рекурсивного создания destкаталога точную копию srcкаталога:

rsync -a src/ dest

Страница rsyncman объясняет, как это работает:

Завершающая косая черта в источнике [...] позволяет избежать [s] создания дополнительного уровня каталога в месте назначения. Вы можете думать о конце /источника как означающее «копировать содержимое этого каталога», а не «копировать каталог по имени» [...]

Адриан
источник
3
Это создаст srcкаталог в destкаталоге
Zen
7
@ Zen, ни в одной версии, которую rsyncя когда-либо использовал. Если это действительно происходит с вами, вы пропускаете косую черту в конце аргумента исходного каталога.
Адриан
3
Этот подлый слеш - КЛЮЧ ...
Тутука
к сожалению, это не работает, если destэто symlnk для src, а вместо этого заканчивается копирование srcв src/src. Проверено на macOS. Надеялся , что я мог бы заменить bar -> foo/с bar/, но пришлось использовать промежуточный временный каталог.
user5359531
@ user5359531 Если вы знаете, что destэто символическая ссылка src, просто rm destперед запуском вышеупомянутой команды. rsyncдостаточно умен, чтобы создать, destпрежде чем копировать содержимое src. Вам не нужен промежуточный временный каталог.
Адриан
1

Если старая и новая файловые системы доступны для вашего компьютера, рассмотрите возможность использования символической ссылки вместо rsync. Если ваша команда rsync, которую вы используете, не указывает хосты (или если это один и тот же хост), то это именно тот случай. Вы пытаетесь отразить две директории с разными именами на одном хосте. Не используйте для этого rsync, так как вы дублируете данные, и вам придется часто запускать rsync для их синхронизации.

Использование символической ссылки - это одноразовое исправление, которое будет отражать две директории (с разными именами) и почти не требует места. Это похоже на создание каталога псевдонимов, который указывает на другой каталог.

Допустим, у вас был старый git в каталоге / old / path / old_git, а теперь хранилище кода перемещено в / new / path / new_git

Ты можешь сделать:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

Это создаст ссылку как таковую:

/ old / path / old_git -> / new / path / new_git

Таким образом, все, что помещено в new_git, будет немедленно доступно и по-старому, без дублирования данных и без необходимости их постоянной синхронизации.

jrel
источник
1
Будьте осторожны с командой rm -rf old_git. Это удалит весь ваш репозиторий old_git. Если я не правильно понимаю вашу проблему, это может быть плохо.
Jrel
0

Я нахожу альтернативное решение сейчас.

Использование rysnc -r /origin/* /target/может синхронизировать все содержимое из исходного каталога в целевой каталог.

Zen
источник
8
Я полагаю, что это не включает точечные (.foo) файлы, потому что они не будут сопоставлены со звездочкой
Рэй Бургеместр
это зависит от расширения оболочки, технически он передает каждый найденный там файл в качестве аргумента rsync. это почти так же, как бег rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Как указал @RayBurgemeestre, расширение оболочки не будет содержать точечных файлов.
Флориан Кастеллан