The a*dan *a*sintaks dilaksanakan oleh shell, bukan oleh lsperintah.
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 lsperintah itu sendiri tidak pernah melihat *karakter; hanya melihat tiga argumen a1, a2dan a3.
Untuk keperluan ekspansi wildcard, "file" merujuk ke semua entitas dalam direktori saat ini. Misalnya, a1mungkin file biasa, a2mungkin direktori, dan a3mungkin 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 bashdan 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.bakdiperluas 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 .logfile ke direktori induk, Anda dapat mengetik:
mv *.log ..
Jika Anda lupa ..:
mv *.log
dan kebetulan ada dua .logfile di direktori saat ini, itu akan diperluas ke:
mv one.log two.log
yang akan mengganti nama one.logdan clobber two.log.
EDIT : Dan setelah 52 upvotes, menerima, dan lencana Guru, mungkin saya harus benar-benar menjawab pertanyaan dalam judul.
The -datau --directorypilihan untuk lstidak 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. -dOpsi ini memberitahukannya untuk mencantumkan hanya direktori itu sendiri. Ini bisa sangat berguna ketika dikombinasikan dengan wildcard. Jika Anda mengetik:
ls -l a*
lsakan 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 lsperintah tidak pernah melihat *karakter.
Adapun tempat ini didokumentasikan, man lsakan menunjukkan kepada Anda dokumentasi untuk lsperintah pada hampir semua sistem seperti Unix. Pada kebanyakan sistem berbasis Linux, lsperintahnya adalah bagian dari paket GNU coreutils; jika Anda memiliki infoperintah, salah satu info lsatau info coreutils lsharus memberi Anda dokumentasi yang lebih definitif dan komprehensif. Sistem lain, seperti MacOS, dapat menggunakan versi berbeda dari lsperintah, dan mungkin tidak memiliki infoperintah; untuk sistem tersebut, gunakan man ls. Dan ls --helpakan 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 .