Salin dan tempelkan banyak file dengan nama berbeda

10

Saya memiliki banyak file teks dengan nama

foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
...
...
foo_bar_abc_1_1000_geh_original.in

Saya ingin menyalin (dan menyimpan file asli) setiap file dan tempel ke nama yang berbeda (dalam folder yang sama) seperti,

foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_03_geh_copy.in
...
...
foo_bar_abc_1_1000_geh_copy.in

Bagaimana saya bisa melakukan ini menggunakan skrip sederhana?

fenomena
sumber

Jawaban:

13

Ubah direktori ke tempat Anda memiliki file aslinya.

Kemudian uji dengan baris perintah berikut,

for i in *_original.*;do echo cp -p "$i" "${i/_original./_copy.}";done

dan jika terlihat bagus, hapus echodan lakukan penyalinan,

for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done
sudodus
sumber
8

Anda dapat menggunakan mcpdari mmvpaketPasang mmv dengan cara berikut:

mcp "*original*" "#1copy#2"

Ini akan menyalin setiap file yang berisi string "asli" di direktori saat ini dan ganti string ini dengan "copy". Anda dapat menguji apa yang mcpakan dilakukan dengan menambahkan -nflag, namun tidak akan menimpa file secara diam-diam, tetapi bertanya kepada Anda. Menggunakan mmvmemiliki keunggulan dibandingkan cpbahwa Anda tidak harus memanggilnya untuk setiap file tunggal - dengan seribu file yang sepertinya Anda salin, itu membuat perbedaan.

Anda juga dapat menggunakan GNUparallel Instal paralel dengan cara berikut ( --dry-rununtuk pengujian, hapus untuk melakukan penyalinan):

parallel --dry-run cp -p "{}" "{=s/original/copy/=}" ::: *

atau, jika itu memberikan kesalahan "Daftar argumen terlalu panjang":

printf "%s\0" * | parallel --dry-run -0 cp -p "{}" "{=s/original/copy/=}"

Contoh dijalankan

$ ls -1
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_original.in
$ mcp "*original*" "#1copy#2"
$ ls -1
foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_copy.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_copy.in
foo_bar_abc_1_04_geh_original.in

Mari kita timejalankan lebih dari 1000 file masing-masing 100 KiB pada mesin yang lambat :

$ time mcp "*original*" "#1copy#2"
real    0m1.114s
user    0m0.000s
sys     0m0.132s
pencuci mulut
sumber