Я хочу скопировать измененные файлы в хранилище SVN в другой каталог, сохраняя при этом их структуру каталогов.
Прочитав man-страницу awk и xargs, я нашел способ получить измененные имена файлов:
$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/
Но проблема в том, что таким образом структуры каталогов не сохраняются, я хочу скопировать файлы следующим образом:
./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./arch/x86/mm.c -> /tmp/xen/arch/x86/mm.c
./arch/x86/mm/shadow/private.h -> /tmp/xen/arch/x86/mm/shadow/private.h
Я попытался изменить команду cp на cp '{}' / tmp / xen / '{}', но он не указал ни одного файла или каталога. Есть ли способ сделать файл копирования cp и создать каталог, если требуется? И, пожалуйста, укажите, можно ли упростить эту цепочку команд. :-)
Спасибо за все ваши ответы. Поскольку каталог немного велик, я не хочу копировать весь каталог с помощью cp -R или rsync. Предложение CK об использовании смоляной трубы весьма полезно.
svn status -q | awk '{ print $2 }' | xargs tar cf - | (cd /tmp/xen/; tar xvf -)
источник
Вот эта строка для справки:
И на английском:
svn status -q
, которые передаются в ...awk '{print $2}'
xargs tar -c
-x
) в целевой каталог (-C path
):tar -xC /tmp/xen
источник
Используйте «dirname», чтобы извлечь путь «mkdir -p», чтобы создать его, что-то вроде:
источник
rsync -a не создает новые каталоги глубже, чем на глубине 1, поэтому rsync - это только частичное решение и, например, мне не подходит (я нашел свой ответ, как найти каталоги rsync для некоторой удаленной иерархии, когда в середине отсутствует несколько каталогов )
Изменить: я имею в виду, у меня есть источник dir: /home/user/projects/homework/1/1.1/ И я хочу rsync его удаленно: /home/user/projects/homework/1/1.1/ ... но назначение еще нет каталога / home / user / projects / homework ... и я не хочу переносить другие подкаталоги на исходном компьютере, которые находятся в / home / user / projects /
Edit2: нашел способ с опцией rsync --relative: приведенный выше пример будет выглядеть так:
cd / home / projects /; rsync -aR домашнее задание / 1 / 1.1 user @ remote: / home / user / projects /
источник
Я бы предложил следующее:
Кстати, cp с флагом R рекурсивно копирует файлы / папки.
источник
построить структуру каталогов
/tmp/f2
для файлов в/tmp/f
скопировать файл в новое место назначения
/tmp/f2/
источник