Bagaimana cara membuat file cp dan membuat direktori jika tidak ada?

15

Saya ingin menyalin file yang dimodifikasi di repositori svn ke direktori lain, sambil tetap struktur direktori mereka.

Setelah membaca halaman awk dan xargs, saya menemukan cara untuk mengganti nama file seperti ini:

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

Tetapi masalahnya adalah bahwa dengan cara ini struktur direktori tidak dipertahankan, saya ingin menyalin file seperti ini:

./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

Saya telah mencoba mengubah perintah cp menjadi cp '{}' / tmp / xen / '{}' tetapi dikatakan tidak ada file atau direktori tersebut. Apakah ada cara untuk membuat file copy cp dan membuat direktori jika diperlukan? Dan tolong tunjukkan apakah rantai perintah ini dapat disederhanakan. :-)

Terima kasih atas semua balasan Anda. Karena direktori agak besar, saya tidak ingin menyalin seluruh direktori menggunakan cp -R atau rsync. Saran CK untuk menggunakan pipa tar cukup berguna.

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

Jawaban:

12

Beberapa pemikiran cepat:

  • Tambahkan mkdir -p $ (dirname FILE)
  • Bisakah Anda menggunakan pipa tar untuk mengatasinya?

Edit

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

Harus membuat arsip dari file yang dimodifikasi. Kemudian:

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

harus meletakkannya di tempat yang Anda inginkan. Jika perlu dalam satu langkah, itu juga mungkin.

CK.
sumber
4

rsync membuatnya sangat sederhana, itu alat yang biasanya saya gunakan untuk menyalin seluruh struktur direktori:

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

Ini akan membuat direktori repo dan semua isinya di direktori / home / dest / svn, sehingga Anda akan memiliki / home / dest / svn / repo / ...

Jadi untuk Anda contoh:

rsync -rv ./ /tmp/xen/

-a, akan menghemat waktu dan menjadi rekursif di antara hal-hal lain, 'man rsync'.

Pembaruan setelah menyadari saya salah membaca pertanyaan:

Untuk meniru struktur direktori (alternatif tar):

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

Dan kemudian menyalin file sebelum mengatakan 20 menit yang lalu:

find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/
Kyle Brandt
sumber
Itu yang jelas, tapi itu akan menyinkronkan segalanya, bukan hanya file yang dimodifikasi, kan?
CK.
oops, merindukan itu
Kyle Brandt
2

Inilah satu kalimat untuk referensi:

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

Dan dalam bahasa Inggris:

  • dapatkan daftar file yang menarik svn status -q, yang disalurkan ke ...
  • awk yang mengekstrak kolom dengan filepath: awk '{print $2}'
  • xargs digunakan untuk memberikan daftar file ke tar, yang pada gilirannya mengirimkan tarball file ke stdout: xargs tar -c
  • yang segera diekstraksi ulang ( -x) ke direktori target ( -C path):tar -xC /tmp/xen
Tim Abell
sumber
1

Gunakan "dirname" untuk mengekstrak path "mkdir -p" untuk membuatnya, sesuatu seperti:

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

rsync -a tidak membuat direktori baru lebih dalam dari pada kedalaman 1, jadi rsync hanya solusi parsial dan misalnya tidak cocok untuk saya (saya googled untuk menemukan jawaban bagaimana rsync direktori ke beberapa hierarki jarak jauh ketika beberapa direktori hilang di tengah )

Sunting: Maksud saya, saya punya sumber dir: /home/user/projects/homework/1/1.1/ Dan saya ingin rsync ke remote: /home/user/projects/homework/1/1.1/ ... tapi tujuan belum memiliki direktori / home / user / proyek / pekerjaan rumah ... dan saya tidak ingin mentransfer subdirektori lain di mesin sumber yang ada di / home / user / proyek /

Sunting2: Menemukan jalan, dengan rsync - opsi relatif: Contoh di atas akan seperti ini:

cd / home / proyek /; rsync - PR rumah / 1 / 1.1 pengguna @ remote: / home / user / proyek /

zimon
sumber
0

Saya menyarankan yang berikut ini:

  • salin semuanya
  • menemukan file yang tidak dimodifikasi dan menghapusnya, meninggalkan file yang dimodifikasi di tempat mereka.

Omong-omong, cp dengan R flag menyalin file / folder secara rekursif.

cp -R
Karolis T.
sumber
0
  • membangun struktur direktori /tmp/f2untuk file dalam/tmp/f

    $ cd /tmp/f/
    $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
    
  • salin file ke destincation baru /tmp/f2/

    $ cd /tmp/f
    $ find . -type f -exec cp  {}  /tmp/f2/{} -aPv \;
    
ren8zhu
sumber