Varsa cp dosyası nasıl oluşturulur ve dizin oluşturulur?


15

Bir svn deposundaki değiştirilmiş dosyaları dizin yapısını korurken başka bir dizine kopyalamak istiyorum.

Awk ve xargs manpage okuduktan sonra böyle değiştirilmiş dosya adlarını almanın bir yolunu buluyorum:

$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/

Ama sorun bu şekilde dizin yapıları korunmaz, ben böyle dosyaları kopyalamak istiyorum:

./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 komutunu cp '{}' / tmp / xen / '{}' olarak değiştirmeye çalıştım ama böyle bir dosya veya dizin yok dedi. Gerekirse cp kopya dosyası oluşturmanın ve dizin oluşturmanın bir yolu var mı? Lütfen bu komut zincirinin basitleştirilip birleştirilemeyeceğini belirtin. :-)

Tüm cevaplarınız için teşekkürler. Dizin biraz büyük olduğundan, tüm dizini cp -R veya rsync kullanarak kopyalamak istemiyorum. CK'nin katran borusu kullanma önerisi oldukça yararlıdır.

svn status -q | awk '{ print $2 }' | xargs tar cf -  | (cd /tmp/xen/; tar xvf -)

Yanıtlar:


12

Birkaç hızlı düşünce:

  • Mkdir -p $ (dirname FILE) içine ekleyin
  • Hepsini çözmek için katran borusu kullanabilir misiniz?

Düzenle

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

Değiştirilen dosyaların arşivini oluşturmalıdır. Sonra:

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

istediğiniz yere koymalısınız. Bir adımda olması gerekiyorsa, bu da mümkündür.


4

rsync oldukça basit yapar, genel olarak tüm dizin yapılarını kopyalamak için kullandığım araç:

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

Bu, repo dizinini ve / home / dest / svn dizinindeki tüm içeriğini oluşturacaktır, böylece / home / dest / svn / repo / ...

Yani örnek olarak:

rsync -rv ./ /tmp/xen/

-a, zaman damgalarını koruyacak ve diğer şeylerin yanı sıra yinelemeli olacaktır, 'man rsync'.

Soruyu yanlış okuduğumu fark ettikten sonra güncelleyin:

Dizin yapısını taklit etmek için (tar alternatifi):

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

Ve sonra 20 dakika önce dosyaları kopyalamak için:

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

Bu bariz olan, ama bu sadece değiştirilmiş dosyaları değil, her şeyi senkronize edecek, değil mi?
CK.

ayy, bunu kaçırdım
Kyle Brandt

2

İşte referans için bu tek astar:

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

Ve ingilizce:

  • svn status -qiçine piped ilgi, dosyaların listesini almak ...
  • Dosya yollarıyla sütunu ayıklayan awk: awk '{print $2}'
  • xargs, tar dosyasına dosya listesini vermek için kullanılır ve bu da dosyaların stikosuna bir tarball gönderir: xargs tar -c
  • -xhedef dizine ( -C path) derhal yeniden çıkarılır ( ):tar -xC /tmp/xen

1

"Mkdir -p" yolunu oluşturmak için "dirname" komutunu kullanın.

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

1

rsync -a, derinlik 1'den daha derin yeni dizinler oluşturmaz, bu yüzden rsync sadece kısmi bir çözümdür ve örneğin benim için uygun değildir (birkaç dizin ortada eksik olduğunda rsync dizinlerini bazı uzak hiyerarşiye nasıl cevaplayacağımı araştırdım )

Düzenleme: Yani, kaynak dizin var: /home/user/projects/homework/1/1.1/ Ve uzaktan rsync istiyorum: /home/user/projects/homework/1/1.1/ ... ama hedef henüz dizin / home / user / projects / homework ... ve kaynak makinede / home / user / projects / dizinindeki diğer alt dizinleri aktarmak istemiyorum

Edit2: rsync --relative seçeneği ile bir yol buldum: Yukarıdaki örnek şöyle olurdu:

cd / home / projeler /; rsync -aR ödev / 1 / 1.1 kullanıcı @ uzaktan: / ev / kullanıcı / projeler /


0

Aşağıdakileri öneririm:

  • her şeyi kopyala
  • değiştirilmemiş dosyaları bulun ve değiştirilmiş dosyaları yerlerinde bırakarak silin.

Bu arada, R bayrağı ile cp dosyaları / klasörleri özyinelemeli olarak kopyalar.

cp -R

0
  • /tmp/f2içindeki dosyalar için dizin yapısı oluşturun/tmp/f

    $ cd /tmp/f/
    $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
    
  • dosyayı yeni bir yere kopyala /tmp/f2/

    $ cd /tmp/f
    $ find . -type f -exec cp  {}  /tmp/f2/{} -aPv \;
    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.