Як копіювати файл та створювати каталог, якщо його немає?


15

Я хочу скопіювати модифіковані файли у сховищі svn до іншого каталогу, зберігаючи їх структуру каталогів.

Прочитавши сторінку 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 -)

Відповіді:


12

Пара швидких думок:

  • Додати в mkdir -p $ (dirname FILE)
  • Чи можете ви використати дьоготь з дьогтем, щоб все це розібрати?

Редагувати

 tar -cf archive.tar  `svn status -q | awk '{print $2}'`

Потрібно створити архів змінених файлів. Потім:

  tar -xf archive.tar -C /tmp/xen

слід покласти його там, де ви хочете. Якщо це потрібно в один крок, це теж можливо.


4

rsync робить досить простим, це інструмент, який я зазвичай використовую для копіювання цілих структур каталогів:

rsync -av /home/source/svn/repo /home/dest/svn/

Це створить каталог repo та весь його вміст у каталозі / home / dest / svn, тому у вас буде / home / dest / svn / repo / ...

Тож для вас приклад:

rsync -rv ./ /tmp/xen/

-a, зберігав би часові позначки і, серед іншого, був би рекурсивним, "man rsync".

Оновлення після усвідомлення, я неправильно прочитав питання:

Щоб імітувати структуру каталогів (альтернатива tar):

rsync -av --include='*/' --exclude='*' source destination

А потім скопіювати файли, перш ніж сказати 20 хвилин тому:

find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/

Це очевидно, але це синхронізує все, не лише змінені файли, правда?
СК.

ой, пропустив це
Кайл Брандт

2

Ось цей одношаровий довідник:

svn status -q | awk '{print $2}' | xargs tar -c | tar -xC /tmp/xen

І англійською мовою:

  • отримати список цікавих файлів svn status -q, в який вкладається ...
  • awk, який витягує стовпець файловими шляхами: awk '{print $2}'
  • xargs використовується для надання списку файлів для tar, який, у свою чергу, надсилає тарбол файлів у stdout: xargs tar -c
  • який негайно повторно витягується ( -x) у цільовий каталог ( -C path):tar -xC /tmp/xen

1

Використовуйте "dirname", щоб витягти шлях "mkdir -p", щоб створити його, як-от:

xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/

1

rsync -a не створює нових каталогів глибше, ніж на глибині 1, тому rsync є лише частковим рішенням і, наприклад, для мене не підходить (я шукаю відповідь, як перенести каталоги rsync в якусь віддалену ієрархію, коли в середині бракує декількох каталогів )

Редагувати: Я маю на увазі, у мене є джерело dir: /home/user/projects/homework/1/1.1//, і я хочу rsync його для віддаленого: /home/user/projects/homework/1/1.1/ ... але призначення ще не має довідника / домашнього / користувача / проектів / домашнього завдання ... і я не хочу передавати інші підкаталоги у вихідній машині, які знаходяться в / home / user / projects /

Edit2: знайшов спосіб із параметром rsync - відносний: Наведений вище приклад матиме такий вигляд:

cd / Головна / проекти /; rsync -aR домашнє завдання / 1 / 1.1 користувач @ віддалений: / домашня / користувач / проекти /


0

Я б запропонував таке:

  • скопіюйте все
  • знайти немодифіковані файли та видалити їх, залишивши модифіковані файли на своїх місцях.

До речі, cp з прапором R копіює файли / папки рекурсивно.

cp -R

0
  • побудувати структуру каталогів /tmp/f2для файлів у/tmp/f

    $ cd /tmp/f/
    $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
    
  • скопіюйте файл до нового призначення /tmp/f2/

    $ cd /tmp/f
    $ find . -type f -exec cp  {}  /tmp/f2/{} -aPv \;
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.