Як rsync каталог в новий каталог з іншою назвою?


49

Я роблю передачу даних, стара файлова система глибоко покладається на каталог, який зараз знаходиться на іншому шляху. Це каталог git, який зберігає код в Інтернеті. Я не маю прав пересувати його чи перейменувати.

Тож, що я можу зробити, це rsync цей каталог до того ж старого шляху. Але назва каталогів також змінилася.

Чи є простий спосіб я можу rsync каталог до цільового каталогу з іншим ім'ям?

Відповіді:


83

Якщо ви хочете використовувати rsyncрекурсивно зробити destкаталог точною копією srcкаталогу:

rsync -a src/ dest

Сторінка rsyncman пояснює, як це працює:

Косою косою рисою джерела [...] уникайте [s] створення додаткового рівня каталогів у пункті призначення. Ви можете вважати, що трейлінг /на джерело означає "копіювати вміст цього каталогу", а не "копіювати каталог на ім'я" [...]


3
Це створить srcкаталог під destкаталогом
Zen

7
@Zen, не в жодній версії, яку rsyncя коли-небудь використовував. Якщо це насправді відбувається з вами, вам не вистачає кінцевої косої риски в кінці аргументу джерела.
Адріан

3
Цей підлий косою рисою є КЛЮЧОВИЙ ...
tutuca

на жаль, це, здається, не працює, якщо destце symlnk src, він замість цього закінчує копіювання srcв src/src. Тестується на macOS. Сподівався , що я міг би замінити bar -> foo/з bar/, але довелося використовувати проміжний тимчасовий каталог.
користувач5359531

@ 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

Це створить посилання як таке:

/ старий / шлях / старий_гіт -> / новий / шлях / новий_гіт

Так що все, що вводиться в new_git, буде негайно доступним і старим способом, без дублювання даних та без постійної синхронізації.


1
Будьте обережні з командою rm -rf old_git. Це видалить усе ваше сховище old_git. Якщо я правильно не розумію вашої проблеми, це може бути поганою справою.
jrel

0

Зараз я знаходжу альтернативне рішення.

Використовуючи, rysnc -r /origin/* /target/можна синхронізувати весь вміст із вихідного каталогу до цільового каталогу.


8
Я вважаю , що це не відноситься до дот - файли (.foo) , тому що вони не будуть узгоджені з зірочкою
Ray Burgemeestre

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