Bagaimana cara mengekstrak nama file tanpa ekstensi dari path lengkap?

10

Saya mencoba untuk memperbaiki skrip bash pertama saya, dan pada satu titik nama file dilewatkan ke skrip sebagai $1. Saya perlu mengekstrak nama file tanpa ekstensi.
Saat ini, saya mengasumsikan bahwa semua ekstensi adalah tiga huruf jadi saya menghapus 4 karakter terakhir untuk mendapatkan nama file:

a="${1:0:-4}"

Tetapi saya harus dapat bekerja dengan ekstensi yang memiliki lebih dari tiga karakter, seperti %~n1di Windows.
Apakah ada cara untuk mengekstrak nama file tanpa ekstensi dari argumen?

pengguna304822
sumber
stackoverflow.com/questions/2664740/…
sancho.s ReinstateMonicaCellio

Jawaban:

27

Cara biasa untuk melakukan ini di bash adalah dengan menggunakan ekspansi parameter. (Lihat halaman bash man dan cari "Ekspansi Parameter".)

a=${1%.*}

The %menunjukkan bahwa segala sesuatu yang cocok dengan pola berikut ( .*) dari kanan, menggunakan pertandingan sesingkat mungkin, adalah untuk dihapus dari parameter $1. Dalam hal ini, Anda tidak perlu tanda kutip ganda (") di sekitar ekspresi.

garyjohn
sumber
1
Pola file umumnya seperti ini: "Something.eng.ext". Jelas dalam kasus ini ext adalah ekstensi, tetapi menggunakan $ {1%. *} Hanya akan mengembalikan bagian "Sesuatu", kan?
user304822
2
Tidak ${1%.*}akan kembali Something.eng. Jika Anda ingin menghapus semuanya di kanan yang pertama .termasuk ., gunakan ${1%%.*}, yang akan kembali Something.
garyjohn
13

Jika Anda tahu ekstensi, Anda dapat menggunakan nama samaran

$ basename /home/jsmith/base.wiki .wiki
base
Steven Penny
sumber
0

Satu liner di Bash tanpa menggunakan nama bas :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
LuckyDams
sumber