Menggunakan ekspresi reguler dengan cp

11

Ini pertanyaan sederhana. Saya mencoba untuk menyalin semua file di direktori saat ini yang dimulai dengan "sumbu-2" dan diakhiri dengan ".jar" ke direktori target, katakanlah itu ~ / MyDirectory. Pikiran pertama saya adalah mencoba

cp '^axis2.*jar$' ~/MyDirectory

Tapi ini tidak berhasil. Saya bahkan tidak yakin dapat menggunakan ekspresi reguler dengan cp. Saya juga belum benar-benar menggunakan ekspresi reguler untuk sementara waktu dan sintaks saya bisa benar-benar mati. Ketika saya mencoba cp ini hanya menampilkan pesan kesalahan "Tidak ada file atau direktori". Adakah yang punya saran tentang bagaimana cara melakukannya? Terima kasih!

Nick Van Hoogenstyn
sumber

Jawaban:

15

Shell UNIX menggunakan pola glob , bukan ekspresi reguler. Jadi, jika Anda ingin mencocokkan nama file yang dimulai dengan axis2dan diakhiri dengan .jar, Anda menggunakan:

cp axis2*.jar /destination/directory
Riccardo Murri
sumber
Terima kasih banyak! Saya mengetahuinya sendiri, tetapi saya tidak tahu tentang pola glob sehingga itu membantu dan informatif.
Nick Van Hoogenstyn
7

Jika Anda memiliki GNU finddan GNU cp, Anda dapat menggunakan ekspresi reguler seperti pada perintah berikut:

find . -maxdepth 1 -regextype posix-basic -regex '.*/axis2[^/]*jar$' \
       -exec cp -t ~/MyDirectory {} +

Ini bisa berguna jika baik pola glob maupun bash extended pola glob tidak sesuai dengan kebutuhan Anda.

enzotib
sumber
0

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

rename "s/OldFile/NewFile/" OldFile*

OldFile.cdan OldFile.hdiganti namanya menjadi NewFile.cdan NewFile.h, masing-masing

Saya hanya menginginkan hal yang sama persis dengan perintah salin:

copy "s/OldFile/NewFile/" OldFile*

Jadi saya menggandakan skrip itu dan mengubah pernyataan ganti nama untuk disalin File::Copy. Et voila! Perintah salin dengan sintaks perl-regex: jcward / vopy .

Jeff Ward
sumber