Як 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.