- ketika menentukan
ls --directory a*
itu harus mendaftar hanya direktori yang dimulai dengana*
- TAPI daftar file DAN direktori dimulai dengan
a
Pertanyaan :
- di mana saya dapat menemukan beberapa dokumentasi tentang ini, selain
man
dan diinfo
mana saya pikir saya benar-benar melihat? - apakah ini hanya berfungsi dalam BASH?
echo a*
juga akan mencantumkan file yang dimulai dengana
(jika ada). Untuk membuatnya lebih jelas bahwa itu tidakls
melakukan ini tetapi bash.Jawaban:
The
a*
dan*a*
sintaks dilaksanakan oleh shell, bukan olehls
perintah.Saat Anda mengetik
pada prompt shell Anda, shell memperluas
a*
ke daftar semua file yang ada di direktori saat ini yang namanya dimulai dengana
. Misalnya, mungkin memperluasa*
ke urutana1 a2 a3
, dan meneruskannya sebagai argumenls
. Thels
perintah itu sendiri tidak pernah melihat*
karakter; hanya melihat tiga argumena1
,a2
dana3
.Untuk keperluan ekspansi wildcard, "file" merujuk ke semua entitas dalam direktori saat ini. Misalnya,
a1
mungkin file biasa,a2
mungkin direktori, dana3
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:
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 (sepertifind
) dapat melakukan ekspansi wildcard mereka sendiri; Anda harus mengutip argumen untuk menekan ekspansi shell: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:Jika Anda lupa
..
:dan kebetulan ada dua
.log
file di direktori saat ini, itu akan diperluas ke:yang akan mengganti nama
one.log
dan clobbertwo.log
.EDIT : Dan setelah 52 upvotes, menerima, dan lencana Guru, mungkin saya harus benar-benar menjawab pertanyaan dalam judul.
The
-d
atau--directory
pilihan untukls
tidak kirim ke daftar hanya direktori. Ini memberitahu untuk daftar direktori seperti diri mereka sendiri, bukan isinya. Jika Anda memberikan nama direktori sebagai argumenls
, 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
akan memberi Anda daftar panjang setiap file yang namanya dimulaia
, dan dari isi setiap direktori yang namanya dimulaia
. Jika Anda hanya ingin daftar file dan direktori, satu baris untuk masing-masing, Anda dapat menggunakan:yang setara dengan:
Ingat lagi bahwa
ls
perintah tidak pernah melihat*
karakter.Adapun tempat ini didokumentasikan,
man ls
akan menunjukkan kepada Anda dokumentasi untukls
perintah pada hampir semua sistem seperti Unix. Pada kebanyakan sistem berbasis Linux,ls
perintahnya adalah bagian dari paket GNU coreutils; jika Anda memilikiinfo
perintah, salah satuinfo ls
atauinfo coreutils ls
harus memberi Anda dokumentasi yang lebih definitif dan komprehensif. Sistem lain, seperti MacOS, dapat menggunakan versi berbeda darils
perintah, dan mungkin tidak memilikiinfo
perintah; untuk sistem tersebut, gunakanman ls
. Danls --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 .
sumber
a*
memperluas ke daftar semua file di direktori saat ini yang namanya dimulai dengana
.ls subdir/a*
echo
itu. Jadi jika Anda ingin tahu apa yang terjadi ketika Anda melakukannyals a*
, pertama-tama jalankanecho ls a*
echo a*
... shell melakukan ekspansi globshopt -s failglob
menyebabkan perilaku yang sama. Pengaturannullglob
tetapi tidakfailglob
menyebabkan, misalnya,*nosuchfile*
untuk memperluas ke string kosong.Lihat jawaban Keith Thompson; tetapi untuk menjelaskan mengapa
ls --directory a*
memperlihatkan file dan direktori:--directory
Opsi tidak menekan file non-direktori. Alih-alih, ia mendaftar direktori seperti itu, sementara itu jika tidak akan daftar kontennya. Contoh:sumber
-F
opsiUntuk menjadi sangat eksplisit, ini didokumentasikan dalam halaman manual ls (1) :
-d, --directory daftar direktori bukan isi, dan jangan dereferensi tautan simbolik
agar adil, "entri bukan konten" mungkin bisa lebih jelas:
sumber
Globbing
Seperti yang telah dijelaskan, perluasan
*
(dan ekspansi serupa) disebutglob
bing di jargon Unix, dan biasanya merupakan fitur dari prosesor perintah (dikenal sebagai "shell" dalam bahasa Unix). Jadi globbing dapat digunakan di banyak tempat lain juga; ketikman 7 glob
di shell dari distribusi Linux klasik (atau lihat ini ) untuk informasi lebih lanjut tentangglob
bing.Pada awal Unix,
glob
sebenarnya dilaksanakan oleh program terpisah yang disebut/etc/glob
(lihat halaman 10 manual UNIX lama ini untuk dokumentasi untuk itu). Saat ini, ini adalah rutin kode yang disediakan oleh pustaka kode, dan biasanya digunakan oleh shell. Sumber : Wikipedia .Direktori
Mengapa
ls -d
daftar file serta direktori ...The
ls
man page menjelaskan mengapa hal ini terjadi, tetapi dengan penjelasan yang sangat singkat. Jadi, inilah upaya penjelasan yang diperluas:Secara default
ls
daftar isi direktori ketika diberi nama mereka, dan akan melakukan hal yang sama untuk symlink ke direktori. The-d
pilihan berarti, "ketika diberi nama (s) dari direktori (ies)" (yang juga dapat diberikan secara implisit olehglob
bing) , hanya menunjukkan _name_s dari direktori (ies), tetapi tidak isinya. Demikian pula, ketika disediakan dengan (secara eksplisit atau implisit ) nama symlink ke direktori , tunjukkan nama file symlink, bukan isi direktori yang dirujuk.The
-d
pilihan tidak ada hubungannya, sejauh yang saya tahu, dengan yang item yang tercantum; ini dapat dilakukan (sumber: disini ) denganfind
, seperti:find . -maxdepth 1 -type d
. Saya tidak yakin apakah ada cara yang baik untuk melakukannya hanya dengan GNUls
. Berikut adalah beberapa contoh cara menggunakanfind
perintah.Jadi untuk meringkas: Secara default
ls
menunjukkan isi direktori ketika diberi nama path mereka.-d
mengubah perilaku ini, hanya menampilkan nama direktori itu sendiri, seperti yang akan dilakukan untuk file standar.sumber
Dokumentasi tidak mengatakan itu hanya daftar entri direktori tetapi ketika
ls
menerima nama direktori itu daftar entri dir alih-alih isinya. Cara terbaik untuk memahami adalah dengan contoh:sumber
Dokumentasi adalah bagian dari shell . Secara khusus shell melakukan berbagai ekspansi dan penggantian dalam urutan tertentu sebelum menjalankan perintah.
Urutan ekspansi kata untuk shell yang kompatibel dengan Bourne adalah
Jadi,
ls
perintahnya bahkan tidak melihat*
karakter, argumen sudah diperluas dengan semua file yang cocok dengana*
pola glob. Ini tidak seperti pada Windows, di mana setiap perintah yang membutuhkan globbing nama file harus mengimplementasikan fitur ini sendiri.sumber
Kata kunci yang Anda butuhkan (
man bash
) adalah "Perluasan Pathname".sumber