Chcę skopiować zmodyfikowane pliki z repozytorium svn do innego katalogu, zachowując ich strukturę katalogów.
Po przeczytaniu strony awk i xargs znajduję sposób na zmianę nazw plików w następujący sposób:
$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/
Problem polega na tym, że w ten sposób struktury katalogów nie są zachowywane, chcę skopiować pliki w następujący sposób:
./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
Próbowałem zmienić komendę cp na cp „{}” / tmp / xen / „{}”, ale nie było takiego pliku ani katalogu. Czy jest jakiś sposób, aby skopiować plik CP i utworzyć katalog, jeśli jest to wymagane? I proszę wskazać, czy ten łańcuch poleceń można uprościć. :-)
Dziękuję za wszystkie odpowiedzi. Ponieważ katalog jest trochę duży, nie chcę kopiować całego katalogu przy użyciu cp -R lub rsync. Sugestia CK dotycząca użycia rurki smołowej jest dość przydatna.
svn status -q | awk '{ print $2 }' | xargs tar cf - | (cd /tmp/xen/; tar xvf -)
źródło
Oto ten jeden wiersz dla odniesienia:
I po angielsku:
svn status -q
, która jest przesyłana do ...awk '{print $2}'
xargs tar -c
-x
) do katalogu docelowego (-C path
):tar -xC /tmp/xen
źródło
Użyj „dirname”, aby wyodrębnić ścieżkę „mkdir -p”, aby ją utworzyć, podobnie jak:
źródło
rsync -a nie tworzy nowych katalogów głębszych niż w głębi 1, więc rsync jest tylko częściowym rozwiązaniem i na przykład nie nadaje się dla mnie (szukałem odpowiedzi, jak zsynchronizować katalogi do jakiejś zdalnej hierarchii, gdy brakuje kilku katalogów pośrodku )
Edycja: Mam na myśli katalog źródłowy: /home/user/projects/homework/1/1.1/ I chcę zsynchronizować go ze zdalnym: /home/user/projects/homework/1/1.1/ ... ale miejscem docelowym nie ma jeszcze katalogu / home / user / projects / homework ... i nie chcę przenosić innych podkatalogów na maszynie źródłowej, które znajdują się w / home / user / projects /
Edycja2: Znalazłem sposób z opcją rsync --relative: Powyższy przykład wyglądałby następująco:
cd / home / projects /; rsync -aR praca domowa / 1 / 1.1 użytkownik @ pilot: / home / użytkownik / projekty /
źródło
Sugerowałbym następujące:
Nawiasem mówiąc, CP z flagą R kopiuje rekursywnie pliki / foldery.
źródło
buduj strukturę katalogów
/tmp/f2
dla plików w/tmp/f
skopiuj plik do nowego miejsca docelowego
/tmp/f2/
źródło