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


49

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

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

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

Ответы:


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, будет немедленно доступно и по-старому, без дублирования данных и без необходимости их постоянной синхронизации.


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

0

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

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


8
Я полагаю, что это не включает точечные (.foo) файлы, потому что они не будут сопоставлены со звездочкой
— Рэй Бургеместр

это зависит от расширения оболочки, технически он передает каждый найденный там файл в качестве аргумента rsync. это почти так же, как бег rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Как указал @RayBurgemeestre, расширение оболочки не будет содержать точечных файлов.
— Флориан Кастеллан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.