Pertanyaan Linux cp dengan regexp


Saya ingin menyalin beberapa file di direktori, mengganti nama file tetapi melestarikan ekstensi. Apakah ini mungkin dengan sederhana cp, menggunakan regex?

Sebagai contoh :

cp ^myfile\.(.*) mydir/newname.$1

Jadi saya bisa menyalin file yang melestarikan ekstensi tetapi mengganti namanya. Apakah ada cara untuk mendapatkan elemen yang cocok di cp regex untuk menggunakannya dalam perintah? Jika tidak, saya akan melakukan skrip perl yang saya pikir, atau jika Anda memiliki cara lain ...

Terima kasih


5
2017-08-20 23:16


asal


Jawaban:


Misalkan Anda punya myfile.a, myfile.b, myfile.c:

for i in myfile.*; do echo mv "$i" "${i/myfile./newname.}"; done

Ini menciptakan (setelah penghapusan echo) newname.a, newname.b, newname.c.


14
2017-08-20 23:23



Shell tidak memahami regexes umum; Anda harus mengalihdayakan program tambahan untuk itu. Cara scripty klasik untuk menyelesaikan tugas Anda akan menjadi sesuatu seperti

for a in myfile.* ; do
  b=`echo $a | sed 's!^myfile!mydir/newname!'`
  cp $a $b
done

Atau memiliki skrip perl menghasilkan daftar perintah yang kemudian Anda sumberkan ke shell.


1
2017-08-20 23:23



Saya sangat suka sintaks regex dari rename skrip perl (oleh Robin Barker dan Larry Wall), misalnya:

rename "s/OldFile/NewFile/" OldFile*

OldFile.c dan OldFile.h diganti namanya menjadi NewFile.c dan NewFile.h, masing-masing

Saya hanya menginginkan hal yang sama persis dengan perintah copy:

copy "s/OldFile/NewFile/" OldFile*

Jadi saya menduplikasi skrip itu dan mengubah pernyataan mengubah nama untuk menyalin via File::Copy. Et voila! Perintah salin dengan sintaks perl-regex:

https://gist.github.com/jcward/0ead33bd79f2061c68728cc82582241f


0
2018-04-06 18:40