Perintah basename Linux: mengambil nama file dan menghapus sufiks
Perintah basename mengambil komponen terakhir dari string jalur, seperti report.txt dari /home/user/report.txt. Anda juga dapat menghapus akhiran tertentu, misalnya .txt, untuk menghasilkan nama tampilan tanpa mengganti nama file yang sebenarnya.
basename bukan perintah untuk membuka file atau memeriksa keberadaan suatu path. Perintah ini memproses string input, sehingga dapat digunakan pada path yang tidak ada.
Apa itu perintah basename?
Gunakan basename ketika Anda hanya membutuhkan komponen terakhir dari sebuah jalur.
basename /home/user/report.txt
Keluaran adalah sebagai berikut.
report.txt
Perintah ini mengolah teks tanpa membuka file. Contoh Linux berikut memakai GNU Coreutils; periksa basename --version dan basename --help jika opsi tertentu tidak dikenali. Tidak ada file contoh yang harus dibuat terlebih dahulu.
Sintaks dasar dan penggunaan
basename nama [akhiran]
basename opsi nama...
Contoh penggunaan dasar adalah sebagai berikut.
basename /var/log/nginx/access.log
basename /home/user/Documents/
basename relative/path/file.txt
Hasil ketiga perintah berturut-turut adalah access.log, Documents, dan file.txt. Garis miring di akhir dihapus sebelum komponen terakhir diambil. Untuk input / atau rangkaian garis miring yang hanya menunjuk root, hasilnya umumnya /; input khusus // dapat bergantung pada platform. GNU basename '' menghasilkan nama kosong diikuti baris baru, bukan memeriksa direktori saat ini.
Menghapus Sufiks
Menentukan Sufiks dengan Argumen Kedua
Argumen kedua adalah sufiks, yaitu teks akhiran yang ingin dihapus dari komponen terakhir. Tanpa -a atau -s, dua argumen tidak berarti dua jalur yang diproses terpisah.
basename /data/archive.tar.gz .gz
basename /home/user/report.txt .txt
Keluaran adalah archive.tar dan report, masing-masing. Untuk menghapus seluruh .tar.gz, tentukan seluruh string yang akan dihapus.
basename /data/archive.tar.gz .tar.gz
Menghapus Akhiran dari Beberapa Nama dengan -s
Opsi GNU basename -s atau --suffix menentukan akhiran sebagai opsi. Menggunakan opsi ini juga mengaktifkan perilaku -a untuk memproses beberapa nama sekaligus.
basename -s .jpg /images/a.jpg /backup/b.jpg
basename --suffix=.log /var/log/app.log /tmp/test.log
Jika akhiran tidak cocok, komponen terakhir tetap ditampilkan utuh. Sufiks dibandingkan secara literal, bukan sebagai ekspresi reguler atau pola wildcard. Ada pengecualian penting: sufiks yang sama dengan seluruh nama tidak dihapus; basename .txt .txt tetap menghasilkan .txt. Sufiks yang mengandung / juga tidak cocok setelah komponen direktori dan garis miring akhir dibuang.
Memproses Beberapa Jalur
Memproses beberapa nama dengan -a
Menggunakan -a atau --multiple memungkinkan Anda memproses beberapa jalur sekaligus dan menampilkan setiap hasil pada baris yang terpisah.
basename -a /srv/www/index.html /var/log/syslog /home/user
Keluaran memiliki bentuk sebagai berikut.
index.html
syslog
user
Pisahkan dengan NUL menggunakan -z
Nama file dapat menyertakan karakter baris baru. Untuk menghindari ambiguitas dalam otomatisasi, Anda dapat mengeluarkan karakter NUL sebagai pengganti baris baru di akhir setiap hasil menggunakan -z atau --zero.
basename -z -a /data/file1 /data/file2
Keluaran contoh adalah byte file1, NUL, file2, NUL. Program penerima harus memahami pemisah NUL; karakter ini tidak terlihat seperti baris baru di terminal. Jangan menyimpan keluaran NUL dalam variabel shell biasa karena byte NUL tidak dapat dipertahankan dengan utuh.
Membandingkan basename dan dirname
| Input | basename |
dirname |
|---|---|---|
/home/user/report.txt |
report.txt |
/home/user |
docs/manual.pdf |
manual.pdf |
docs |
notes.txt |
notes.txt |
. |
/ |
/ |
/ |
Kedua perintah ini berguna saat membagi string path secara komplementer. Namun, hanya dengan menyambungkan kembali kedua output dengan garis miring mungkin tidak menghasilkan string yang identik dengan aslinya karena adanya garis miring ganda atau input khusus.
Menangani ekstensi file
Menghapus ekstensi yang diketahui
Jika ekstensi yang akan dihapus sudah ditentukan, menggunakan argumen suffix adalah metode yang jelas.
basename photo.webp .webp
basename backup.tar.gz .tar.gz
Metode ini hanya menghapus ekstensi ketika akhirannya benar-benar cocok, jadi pada report.txt.bak, .txt tidak akan dihapus.
Tidak secara otomatis menganggap semua yang ada setelah titik terakhir sebagai ekstensi
Hanya karena nama file memiliki titik tidak berarti selalu memiliki ekstensi. Ada file tersembunyi yang diawali dengan titik seperti .profile, file dengan banyak sufiks seperti archive.tar.gz, dan nama yang diakhiri dengan titik.
Tentukan dengan jelas sufiks yang akan dihapus sesuai aturan kerja Anda, dan berhati-hatilah ketika hanya menghapus semua yang ada setelah titik terakhir.
Menggunakan basename dalam skrip shell
Mengambil nama tampilan dari jalur
Simpan contoh lengkap berikut sebagai display-name.sh, lalu jalankan sh display-name.sh '/srv/uploads/annual report.pdf'. Skrip memerlukan shell POSIX dan utilitas basename; hasilnya adalah Nama file: annual report.pdf.
#!/bin/sh
if [ "$#" -ne 1 ]; then
printf '%s\n' 'Penggunaan: sh display-name.sh PATH' >&2
exit 2
fi
name=$(basename -- "$1") || exit 1
printf 'Nama file: %s\n' "$name"
-- mengakhiri opsi sehingga nama yang diawali tanda hubung tetap menjadi argumen nama. Kutip argumen untuk mempertahankan spasi dan mencegah pemisahan kata atau ekspansi glob oleh shell. Jumlah argumen yang salah menghasilkan status 2; kegagalan basename menghasilkan status 1, sedangkan pemrosesan yang berhasil menghasilkan status 0.
Substitusi perintah $(...) menghapus baris baru di akhir keluaran. Contoh ini sesuai untuk nama biasa, tetapi tidak mempertahankan nama yang berakhir dengan baris baru secara utuh. Untuk pemrosesan nama arbitrer, pertimbangkan aliran NUL dan penerima yang sesuai, alih-alih menganggap satu baris selalu sama dengan satu nama.
Membandingkan dengan Ekspansi Parameter Shell POSIX
Jika Anda hanya memerlukan bagian terakhir dari jalur di dalam shell, Anda juga dapat menggunakan ekspansi parameter alih-alih perintah eksternal.
path='/srv/uploads/report.pdf'
name=${path##*/}
printf '%s\n' "$name"
Hasil contoh adalah report.pdf. Pola ##*/ membuang prefiks terpanjang yang berakhir dengan /. Untuk path='docs/' atau path='/', ekspansi itu menghasilkan string kosong, sedangkan basename memberikan hasil berbeda. Gunakan cara ini jika format masukan sudah dikendalikan dan tidak memerlukan aturan khusus basename.
Ringkasan opsi utama
| Opsi | Deskripsi |
|---|---|
-a, --multiple |
Menangani beberapa nama dan menampilkan setiap hasil. |
-s suffix, --suffix=suffix |
Menghapus akhiran tertentu dari akhir setiap nama dan juga memungkinkan menangani beberapa nama. |
-z, --zero |
Mengakhiri setiap hasil dengan karakter NUL alih-alih baris baru. |
--help |
Menampilkan penggunaan dan opsi yang didukung. |
--version |
Mencetak versi GNU Coreutils yang terpasang. |
Opsi seperti -a, -s, dan -z adalah ekstensi GNU. Jika Anda menulis skrip untuk dijalankan di berbagai sistem mirip Unix, periksa implementasinya pada sistem target dan prioritaskan format standar yang didefinisikan oleh POSIX.
Masalah umum
Hasil dicetak meskipun file tidak ada
Ini adalah perilaku normal. basename mengekstrak bagian terakhir dari string input tanpa memeriksa keberadaan file. Jika operasi memerlukan file yang sebenarnya, Anda harus memeriksa keberadaan dan izin secara terpisah.
Jalur dengan spasi dibagi menjadi beberapa argumen
Jika Anda tidak mengapit variabel dengan tanda kutip ganda, pemisahan kata shell dan ekspansi glob mungkin terjadi.
path='/srv/uploads/annual report.pdf'
basename -- "$path"
Akhiran tidak dihapus
Akhiran harus cocok persis dan peka huruf besar-kecil. Nama photo.JPG tidak dipotong oleh sufiks .jpg. Ingat pula bahwa sufiks yang sama dengan seluruh nama tidak dihapus. Status berhasil hanya berarti string telah diproses, bukan bahwa file ada atau sufiks pasti ditemukan.
FAQ
Apakah basename mengganti nama file yang sebenarnya?
Tidak. Itu hanya menghitung dan menampilkan nama terakhir dari string jalur input tanpa mengubah file atau direktori apapun.
Apakah basename dapat menghapus ekstensi?
Ya, misalnya basename path.txt .txt menghasilkan path. Untuk beberapa nama pada GNU Coreutils, gunakan basename -s .txt nama1.txt nama2.txt. Perintah ini hanya memotong sufiks yang cocok, bukan otomatis membuang semua teks setelah titik terakhir.
Apakah basename bekerja pada jalur yang tidak ada?
Ya. Karena hanya memproses string jalur, ia menampilkan komponen terakhir bahkan jika file yang sebenarnya tidak ada.
Apa perbedaan dengan dirname?
basename mengeluarkan nama terakhir, sementara dirname mengeluarkan bagian direktori tanpa menyertakan nama terakhir.
Dokumentasi resmi
Untuk konteks utilitas lain, lihat daftar perintah Linux menurut tugas (bahasa Inggris). Rincian perilaku dan portabilitas tersedia pada sumber berikut.




