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?


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.


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


0

Satu liner di Bash tanpa menggunakan nama bas :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.