Mengapa wildcard ini tidak berfungsi seperti yang saya harapkan?

11

Pada folder pengguna saya, saya memiliki folder seperti D ropbox, D Documents, D ownloads & d UMP.

ls a*harus mencantumkan semua file yang namanya dimulai dengan a. Baik? Tetapi ketika saya memberikan perintah ls d*, alih-alih hanya menampilkannya dumpmenunjukkan kepada saya ls dari direktori dump. Dan ketika saya memberikan perintah ls D*, maka akan menampilkan ls dari semua lipatan dimulai dengan D

Jadi, bagian apa yang saya lewatkan dalam memahaminya?

Edit: Melampirkan tangkapan layar tangkapan layar ls

Asfame
sumber

Jawaban:

17

Menurut halaman bash man:

bash memindai setiap kata untuk karakter *,?, dan [. Jika salah satu karakter ini muncul, maka kata tersebut dianggap sebagai pola, dan diganti dengan daftar nama file yang diurutkan berdasarkan abjad yang cocok dengan pola tersebut.

dan dari simpul info untuk ls

Program `ls 'mencantumkan informasi tentang file (jenis apa pun, termasuk direktori). Opsi dan argumen file dapat dicampur secara sewenang-wenang, seperti biasa.

Untuk argumen baris perintah non-opsi yang merupakan direktori, secara default 'ls' mencantumkan isi direktori, tidak secara rekursif, dan menghilangkan file dengan nama yang diawali dengan '.'. Untuk argumen non-opsi lainnya, secara default `ls 'hanya mencantumkan nama file. Jika tidak ada argumen non-opsi yang ditentukan, 'ls' daftar isi direktori saat ini.

jadi ketika Anda memberi ls d*, d * diperluas ke daftar semua nama file / direktori yang diurutkan mulai dengan d. Jadi perintahmu menjadi

ls dump

dan karena dump adalah nama direktori sehingga Anda mendapatkan daftar semua file di direktori "dump 'tetapi ketika Anda memberi ls D*, D * diperluas ke" Desktop Documents Downloads Dropbox ", sehingga perintah menjadi

ls Desktop Documents Downloads Dropbox

dan karena semua ini adalah direktori, Anda mendapatkan daftar file dalam direktori individual. Jika ada file yang dimulai dengan D di direktori saat ini, file tersebut akan terdaftar secara terpisah.

binW
sumber
2
Tambahan kecil: Ketika lebih dari satu direktori diberikan sebagai argumen, ls menampilkan nama setiap direktori sebelum daftar isinya. Itu tidak akan melakukannya untuk satu direktori.
Marcel Stimberg
Terima kasih! Itu menghapus keraguan saya. Saya melakukan ls p*dan itu muncul file karena ada dan ls P*menunjukkan yang Gambar Umum folder karena tidak ada file yang dimulai dengan P . Dan ketika saya membuat direktori bernama poo , muncul dils p*
Ashfame
7

ls d * dan D * baik daftar file dan folder yang cocok masing-masing d * dan D *, perilakunya sama, pasti ada kesalahan pada tes Anda.

Jika Anda hanya ingin mencantumkan nama folder dan bukan isi folder, Anda perlu menggunakan "-d":

ls -d D*
João Pinto
sumber
Saya telah memasang tangkapan layar, silakan lihat
Ashfame
0

Seperti yang disarankan di atas, -dopsi adalah cara untuk pergi. Menambahkan

alias ld='ls -d'

ke ~/.bashrcfile saya berfungsi dengan baik untuk saya.

pengguna3179473
sumber
3
Dengan alias ini, Anda memblokir akses yang mudah ld - The GNU linker, yang akan membuat OP tidak dapat menyusun dan menautkan program. Gunakan alias lsd='ls -d'sebagai gantinya. Sebelum aliasing sesuatu seperti foobiasa dilakukan type foountuk melihat apakah foosudah digunakan sebagai nama untuk sesuatu, dan memutuskan apakah kenyamanan alias menimpa hilangnya akses ke sebelumnyafoo
waltinator