Perilaku aneh "ls-a | grep ^ \. "

10

Saya ingin membuat daftar isi pwd dan hanya menampilkan file yang dimulai dengan titik. Saya sudah mencoba ls -a | grep ^\.tetapi saya tidak tahu mengapa output juga berisi file-file yang tidak dimulai dengan titik. Sebagai contoh:

Pictures
.pip
.pki
.profile
projects
Public

Saya tahu bahwa saya dapat mencapai apa yang saya inginkan dengan ls -ld .*saya hanya ingin tahu tentang perilaku grep ini yang tidak dapat saya jelaskan.

ps-aux
sumber
Mengapa tidak hanya ls -d .*mendaftar semua file yang dimulai dengan .?
Barmar
Catatan peringatan: Jangan pernah menyalurkan output ls ke perintah lain. Gunakan temukan saja. Ada terlalu banyak ideosyncrasi yang bisa dipercaya. Lihat: Pitfall 1 di mywiki.wooledge.org/BashPitfalls - ini berhasil menjadi # 1! Sisa situs juga bagus.
Joe

Jawaban:

20

Kutip argumen untuk grepituls -a | grep '^\.'

Alasan untuk ini adalah bahwa shell menangani \.dan mengubahnya kembali menjadi polos ., yang grepkemudian diperlakukan sebagai wildcard satu karakter. Jika ragu, selalu kutip string yang berisi (atau mungkin mengandung) karakter yang spesial untuk shell.

roaima
sumber
Mengapa shell abaikan \?
ps-aux
\ adalah urutan pelarian yang membuat shell memperlakukan karakter berikut sebagai karakter literal. Dalam hal ini grep ^\\., \\ diperlakukan oleh shell sebagai backslash tunggal dan lagi grep memperlakukan backslash tunggal diikuti oleh titik sebagai titik literal.
Avinash Raj
11

Anda perlu memasukkan grep regex di dalam tanda kutip.

ls -a | grep '^\.'

Catatan: Jangan parsing output dari lsperintah .

Avinash Raj
sumber
Mengapa buruk untuk mengurai output ls?
ps-aux
Dari tautan: Dalam mode default, jika output standar bukan terminal, ls memisahkan nama file dengan baris baru. Ini bagus sampai Anda memiliki file dengan baris baru di namanya.
Michael Durrant
@ Michael Durrant: Saya menyarankan agar mengizinkan baris baru dalam nama file adalah bug sistem utama.
jamesqf
@ jamesqf - lihat baris baru dalam nama file (terutama jawaban sml ).
don_crissti
0

Jika Anda menjalankan cmd ls -a | grep ^ \. maka grep jangan menganggap "\" sebagai karakter khusus dan makna "." jangan sampai lolos.

Ketika kita menggunakan cmd ls -a | grep "^ \." maka grep menganggap "\" sebagai karakter khusus dan makna "." melarikan diri. Ini akan memberi Anda hasil seperti yang diharapkan.

Jika Anda ingin menggunakan grep cmd tanpa tanda kutip maka Anda juga harus melarikan diri dari karakter "\". Anda dapat mengharapkan hasil tanpa tanda kutip ganda dengan mengikuti perintah. ls -a | grep ^ \\.

Untuk detail tentang arti karakter khusus di Regex, lihat tautan berikut. http://www.regular-expressions.info/quickstart.html

AVJ
sumber