Cara menyalin file di shell unix menggunakan wildcard

6

Saya mencoba menyalin beberapa file ke folder yang ada. Ini adalah contoh skema

# origin 
/home/user/myfiles/folder1/group1/1.jpg
/home/user/myfiles/folder1/group1/2.jpg
/home/user/myfiles/folder1/group2/1.jpg
/home/user/myfiles/folder1/group2/2.jpg
/home/user/myfiles/folder2/group1/1.jpg
/home/user/myfiles/folder2/group1/2.jpg
/home/user/myfiles/folder2/group2/1.jpg
/home/user/myfiles/folder2/group2/2.jpg

Skema folder tujuan sudah ada, hanya file asal (jpg) yang tidak ada.

Pertanyaan saya adalah bagaimana melakukan ini?

Saya ingin berakhir dengan sesuatu seperti di bawah ini, tetapi ini tidak berhasil. Mungkin saya harus memasukkan regex dalam kueri untuk memisahkan asterisk menjadi nilai dan digunakan sebagai asal / tujuan?

 cp /home/user/myfiles/*/*/*.jpg  /home2/user/myfiles/*/*/*.jpg

Tujuan awal saya adalah menggunakan skema penyalinan ini pada pertanyaan saya yang belum dijawab: s3cmd: bagaimana cara menyalin file dari lokal ke bucket S3 dengan struktur yang ada sebagai solusi yang memungkinkan.

Martin
sumber
Apakah folder tujuan benar-benar kosong? Jika demikian hapus saja dan salin file dan struktur direktori. Juga, perluasan shell dari set kedua asterix adalah masalah Anda.
Hennes
Mereka tidak. Mereka memiliki jenis file lain yang masih saya butuhkan.
Martin
Bisakah Anda menguraikan kalimat terakhir Anda?
Martin
Aku bisa, tetapi aku masih berusaha untuk membungkus kepalaku dengan tujuan yang tepat. Perintah cp memiliki sumber dan tujuan yang sama. Pertanyaan s3cmd mengidentifikasi dev lokal dan situs s3 jarak jauh, yang bisa saya mengerti. Tetapi pertanyaan saat ini tampaknya menjadi NOP. (Memang, itu mungkin karena aku mengantuk).
Hennes
@ Henry Maaf telah menyesatkan Anda, baru saja memperbaiki pertanyaan. Dest harus berbeda dari asal!
Martin

Jawaban:

4

Dengan GNU cp Anda dapat menggunakan --parentsopsi, seperti ini:

cd /home/user/myfiles ; cp --parents */*/*.jpg /home2/user/myfiles/

Anda harus cdterlebih dahulu karena jika Anda melakukannya cp --parents /home/user/myfiles/...akan membuat orang tua itu juga, dan Anda akan berakhir dengan /home2/user/myfiles/home/parents/myfiles/.

Jika Anda membutuhkan jawaban non-GNUish, metode unix tradisional akan menjadi tar di atas pipa.

cd /home/user/myfiles ; tar cf - */*/*.jpg | ( cd /home2/user/myfiles ; tar xf - )

Yang kedua cdadalah dalam subkulit dengan tar kedua, jadi di situlah file diekstraksi. Tarball itu sendiri dibuat, dikirim melalui pipa, dan diekstraksi pada waktu yang bersamaan. Tambahkan vbendera ke salah satu ter jika Anda ingin melaporkan kemajuan.

Alan Curry
sumber
1

Yang berikut harus melakukan trik:

for i in `find /home/user/myfiles/folder1 -print`; do 
  if [ ! -d $i ]; 
    then filePath=`echo $i | cut -f 4- -d"/"`; 
         cp $i /home/user/myfiles/folder2/$filePath; 
  fi; 
done

Pada dasarnya, saya mengekstraksi bagian dari nama file yang akan berubah di antara dua folder, dan kemudian mengeluarkan perintah salin.

Perhatikan "cut -f 4- " di atas - ia mendapat bidang dari tanggal 4 dan seterusnya. Anda dapat mengubah nomor sesuai keinginan Anda

Mungkin bahkan basenameatau perintah yang lebih sederhana ada ... tetapi ini akan berlaku untuk saat ini :)

Sudipta Chatterjee
sumber