Jak utworzyć plik CP i utworzyć katalog, jeśli nie istnieje?

15

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 -)
ZelluX
źródło

Odpowiedzi:

12

Kilka szybkich myśli:

  • Dodaj plik mkdir -p $ (nazwa pliku PLIK)
  • Czy możesz użyć rurki smołowej, aby to wszystko załatwić?

Edytować

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

Powinien utworzyć archiwum zmodyfikowanych plików. Następnie:

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

powinieneś to umieścić tam, gdzie chcesz. Jeśli musi to być jeden krok, to też jest możliwe.

CK
źródło
4

rsync sprawia, że ​​jest to bardzo proste, to narzędzie, którego zwykle używam do kopiowania całych struktur katalogów:

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

Spowoduje to utworzenie katalogu repo i całej jego zawartości w katalogu / home / dest / svn, więc będziesz mieć / home / dest / svn / repo / ...

Na przykład dla ciebie:

rsync -rv ./ /tmp/xen/

-a zachowałby znaczniki czasu i byłby rekurencyjny między innymi „man rsync”.

Zaktualizuj po uświadomieniu sobie, że źle przeczytałem pytanie:

Aby naśladować strukturę katalogów (alternatywa tar):

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

A następnie, aby skopiować pliki przed powiedzmy 20 minut temu:

find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/
Kyle Brandt
źródło
To oczywiste, ale zsynchronizuje wszystko, nie tylko zmodyfikowane pliki, prawda?
CK.
Ups, przegapiłem
Kyle Brandt,
2

Oto ten jeden wiersz dla odniesienia:

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

I po angielsku:

  • pobierz listę interesujących plików svn status -q, która jest przesyłana do ...
  • awk, który wyodrębnia kolumnę z ścieżkami plików: awk '{print $2}'
  • xargs służy do podania listy plików do tar, co z kolei wysyła plik tar do plików na standardowe wyjście: xargs tar -c
  • który jest natychmiast ponownie rozpakowywany ( -x) do katalogu docelowego ( -C path):tar -xC /tmp/xen
Tim Abell
źródło
1

Użyj „dirname”, aby wyodrębnić ścieżkę „mkdir -p”, aby ją utworzyć, podobnie jak:

xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/
wazoox
źródło
1

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 /

zimon
źródło
0

Sugerowałbym następujące:

  • skopiuj wszystko
  • znajdź niezmodyfikowane pliki i usuń je, pozostawiając zmodyfikowane pliki na swoich miejscach.

Nawiasem mówiąc, CP z flagą R kopiuje rekursywnie pliki / foldery.

cp -R
Karolis T.
źródło
0
  • buduj strukturę katalogów /tmp/f2dla plików w/tmp/f

    $ cd /tmp/f/
    $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
    
  • skopiuj plik do nowego miejsca docelowego /tmp/f2/

    $ cd /tmp/f
    $ find . -type f -exec cp  {}  /tmp/f2/{} -aPv \;
    
ren8zhu
źródło