Bagaimana cara saya mendapatkan ekstensi file dari bash? Inilah yang saya coba:
filename=`basename $filepath`
fileext=${filename##*.}
Dengan melakukan itu saya bisa mendapatkan ekstensi dari bz2
path /dir/subdir/file.bz2
, tapi saya punya masalah dengan path /dir/subdir/file-1.0.tar.bz2
.
Saya lebih suka solusi menggunakan hanya bash tanpa program eksternal jika memungkinkan.
Untuk memperjelas pertanyaan saya, saya membuat skrip bash untuk mengekstrak arsip apa pun yang diberikan hanya dengan satu perintah extract path_to_file
. Cara mengekstrak file ditentukan oleh skrip dengan melihat kompresi atau jenis pengarsipannya, yang bisa berupa .tar.gz, .gz, .bz2 dll. Saya pikir ini harus melibatkan manipulasi string, misalnya jika saya mendapatkan ekstensi .gz
maka saya harus memeriksa apakah ia memiliki string .tar
sebelum .gz
- jika demikian, ekstensi seharusnya .tar.gz
.
.tar.bz2
Jawaban:
Jika nama file adalah
file-1.0.tar.bz2
, ekstensi itubz2
. Metode yang Anda gunakan untuk mengekstrak ekstensi (fileext=${filename##*.}
) benar-benar valid¹.Bagaimana Anda memutuskan bahwa Anda ingin menjadi ekstensi
tar.bz2
dan tidakbz2
atau tidak0.tar.bz2
? Anda harus menjawab pertanyaan ini terlebih dahulu. Kemudian Anda bisa mengetahui perintah shell apa yang cocok dengan spesifikasi Anda.Satu spesifikasi yang mungkin adalah ekstensi harus dimulai dengan huruf. Heuristik ini gagal untuk beberapa ekstensi umum seperti
7z
, yang mungkin diperlakukan sebagai kasus khusus. Berikut ini adalah implementasi bash / ksh / zsh:Untuk portabilitas POSIX, Anda perlu menggunakan
case
pernyataan untuk pencocokan pola.Spesifikasi lain yang mungkin adalah bahwa beberapa ekstensi menunjukkan pengkodean dan menunjukkan bahwa pengupasan lebih lanjut diperlukan. Berikut ini adalah implementasi bash / ksh / zsh (membutuhkan di
shopt -s extglob
bawah bash dan disetopt ksh_glob
bawah zsh):Perhatikan bahwa ini dianggap
0
sebagai ekstensi difile-1.0.gz
.¹ dan konstruk terkait dalam POSIX , sehingga mereka bekerja di shell gaya Bourne non-antik seperti abu, bash, ksh atau zsh.
${VARIABLE##SUFFIX}
sumber
.
token terakhir adalah tipe arsip, misalnyatar
, jika bukan tipe arsip seperti0
iterasi yang harus diakhiri..patch.lzma
. Sebuah heuristik yang lebih baik akan mempertimbangkan string setelah yang terakhir.
: jika akhiran kompresi (.7z
,.bz2
,.gz
, ...), terus stripping.Anda dapat menyederhanakan masalah dengan hanya melakukan pencocokan pola pada nama file daripada mengekstraksi ekstensi dua kali:
sumber
Komentar untuk ini di sini: http://liquidat.wordpress.com/2007/09/29/short-tip-get-file-extension-in-shell-script/
sumber
.tar.gz
ekstensiInilah kesempatan saya: Menerjemahkan titik ke baris baru, menelusuri
tail
, mendapatkan baris terakhir:sumber
Sebagai contoh:
sumber
printf
jika nama file berisi backslash atau dimulai dengan-
:"${filename#$(printf %s "$filename" | sed 's/\.[^[:digit:]].*$//g;')}"
Suatu hari saya telah membuat fungsi-fungsi rumit:
Saya telah menemukan pendekatan langsung ini, sangat berguna dalam banyak kasus, tidak hanya ketika itu tentang ekstensi.
Untuk memeriksa ekstensi - Sederhana dan dapat diandalkan
Untuk memotong ekstensi:
Untuk mengubah ekstensi:
Atau, jika Anda suka "fungsi praktis:
NB Jika Anda menyukai fungsi-fungsi itu atau ternyata bermanfaat, silakan merujuk ke posting ini :) (dan semoga beri komentar).
sumber
jawaban kasus berbasis jackman cukup bagus dan portabel, tetapi jika Anda hanya ingin nama file dan ekstensi dalam variabel saya telah menemukan solusi ini:
Ini hanya berfungsi dengan ekstensi ganda dan yang pertama harus "tar".
Tetapi Anda dapat mengubah jalur tes "tar" dengan tes panjang string dan ulangi perbaikan berulang kali.
sumber
saya menyelesaikannya menggunakan ini:
tetapi ini hanya berfungsi untuk jenis pengarsipan yang dikenal, dalam hal ini saja
tar
sumber