The a*
dan *a*
sintaks dilaksanakan oleh shell, bukan oleh ls
perintah.
Saat Anda mengetik
ls a*
pada prompt shell Anda, shell memperluas a*
ke daftar semua file yang ada di direktori saat ini yang namanya dimulai dengan a
. Misalnya, mungkin memperluas a*
ke urutan a1 a2 a3
, dan meneruskannya sebagai argumen ls
. The ls
perintah itu sendiri tidak pernah melihat *
karakter; hanya melihat tiga argumen a1
, a2
dan a3
.
Untuk keperluan ekspansi wildcard, "file" merujuk ke semua entitas dalam direktori saat ini. Misalnya, a1
mungkin file biasa, a2
mungkin direktori, dan a3
mungkin symlink. Mereka semua memiliki entri direktori, dan ekspansi wildcard shell tidak peduli seperti apa entitas entri itu merujuk.
Praktis semua shell yang mungkin Anda temui (bash, sh, ksh, zsh, csh, tcsh, ...) menerapkan wildcard. Detailnya dapat bervariasi, tetapi sintaks dasar *
pencocokan karakter nol atau lebih dan ?
pencocokan karakter tunggal cukup konsisten.
Khususnya untuk bash, ini didokumentasikan di bagian "Perluasan nama file" dari manual bash; jalankan info bash
dan cari "Perluasan nama file", atau lihat di sini .
Fakta bahwa ini dilakukan oleh shell, dan bukan oleh perintah individu, memiliki beberapa konsekuensi yang menarik (dan kadang mengejutkan). Hal terbaik tentang itu adalah penanganan wildcard konsisten untuk (hampir) semua perintah; jika shell tidak melakukan ini, pasti beberapa perintah tidak akan mengganggu, dan yang lain akan melakukannya dengan cara yang agak berbeda yang menurut penulis adalah "lebih baik". (Saya pikir shell perintah Windows memiliki masalah ini, tapi saya tidak cukup akrab dengannya untuk berkomentar lebih lanjut.)
Di sisi lain, sulit untuk menulis perintah untuk mengganti nama banyak file. Jika Anda menulis:
mv *.log *.log.bak
mungkin akan gagal, karena *.log.bak
diperluas berdasarkan file yang sudah ada di direktori saat ini. Ada perintah yang melakukan hal semacam ini, tetapi mereka harus menggunakan sintaks mereka sendiri untuk menentukan bagaimana file akan diganti namanya. Beberapa perintah (seperti find
) dapat melakukan ekspansi wildcard mereka sendiri; Anda harus mengutip argumen untuk menekan ekspansi shell:
find . -name '*.txt' -print
Ekspansi wildcard shell seluruhnya didasarkan pada sintaks dari argumen command-line dan set file yang ada. Itu tidak bisa dipengaruhi oleh arti perintah. Misalnya, jika Anda ingin memindahkan semua .log
file ke direktori induk, Anda dapat mengetik:
mv *.log ..
Jika Anda lupa ..
:
mv *.log
dan kebetulan ada dua .log
file di direktori saat ini, itu akan diperluas ke:
mv one.log two.log
yang akan mengganti nama one.log
dan clobber two.log
.
EDIT : Dan setelah 52 upvotes, menerima, dan lencana Guru, mungkin saya harus benar-benar menjawab pertanyaan dalam judul.
The -d
atau --directory
pilihan untuk ls
tidak kirim ke daftar hanya direktori. Ini memberitahu untuk daftar direktori seperti diri mereka sendiri, bukan isinya. Jika Anda memberikan nama direktori sebagai argumen ls
, secara default ia akan mencantumkan isi direktori, karena biasanya itulah yang Anda minati. -d
Opsi ini memberitahukannya untuk mencantumkan hanya direktori itu sendiri. Ini bisa sangat berguna ketika dikombinasikan dengan wildcard. Jika Anda mengetik:
ls -l a*
ls
akan memberi Anda daftar panjang setiap file yang namanya dimulai a
, dan dari isi setiap direktori yang namanya dimulai a
. Jika Anda hanya ingin daftar file dan direktori, satu baris untuk masing-masing, Anda dapat menggunakan:
ls -ld a*
yang setara dengan:
ls -l -d a*
Ingat lagi bahwa ls
perintah tidak pernah melihat *
karakter.
Adapun tempat ini didokumentasikan, man ls
akan menunjukkan kepada Anda dokumentasi untuk ls
perintah pada hampir semua sistem seperti Unix. Pada kebanyakan sistem berbasis Linux, ls
perintahnya adalah bagian dari paket GNU coreutils; jika Anda memiliki info
perintah, salah satu info ls
atau info coreutils ls
harus memberi Anda dokumentasi yang lebih definitif dan komprehensif. Sistem lain, seperti MacOS, dapat menggunakan versi berbeda dari ls
perintah, dan mungkin tidak memiliki info
perintah; untuk sistem tersebut, gunakan man ls
. Dan ls --help
akan menampilkan pesan penggunaan yang relatif singkat (117 baris di sistem saya) jika Anda menggunakan implementasi GNU coreutils.
Dan ya, bahkan para ahli perlu membaca dokumentasi sekarang dan nanti. Lihat juga lelucon klasik ini .