Cara membuat daftar file yang dimulai dengan "a" atau "c" dari / etc. [Tutup]

10

Saya mencoba ls /etc/[ac]*tetapi menunjukkan direktori dimulai dengan a atau c , dan seluruh isinya, bukan file yang dimulai dengan " a " atau " c ".

3df
sumber
direktori adalah salah satu dari banyak jenis file . Jenis file apa yang Anda minati (reguler, symlink, perangkat, pipa, soket ...)?
Stéphane Chazelas
Tidak jelas apakah Anda dengan "direktori" berbicara tentang isi direktori, atau tentang nama direktori itu sendiri. Perintah yang Anda perlihatkan akan mencantumkan isi direktori yang cocok dengan pola, dengan ls -d /etc/[ac]*Anda tidak akan mendapatkan konten direktori yang cocok, tetapi masih akan melihat nama direktori. Tidak jelas apakah ini yang Anda inginkan atau apakah Anda ingin menghindari daftar nama direktori.
Kusalananda

Jawaban:

23

Untuk menghindari daftar isi direktori, Anda dapat:

ls -d /etc/[ac]*

Itu akan mencantumkan nama direktori bersama dengan nama file biasa dimulai dengan aatau c.

Untuk kelengkapan, solusi yang tidak melibatkan findmungkin:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
Greg Hewgill
sumber
Pembacaan awal saya atas pertanyaan itu juga membuat ls -dtampaknya tepat, tetapi tampaknya pertanyaan awal menentukan bahwa tidak ada direktori yang harus terdaftar, terlepas dari ekspansi atau non-ekspansi.
Chris Down
1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9jangan diurai ls.
Avinash Raj
1
@AvinashRaj: Ya, relevansi saran itu tergantung pada apakah seseorang membutuhkan solusi ini untuk bekerja sekali, atau selamanya. Jika hanya sekali, maka parsing lsadalah permainan yang adil menurut saya.
Greg Hewgill
3
Dia benar. Sementara nama-nama di /etcsangat mungkin waras, ruang sederhana akan mematahkan lspendekatan karena nomor bidang akan berubah. +1 untuk ls -ldmeskipun.
terdon
1
Anda juga harus memperbaiki lokal ( LC_ALL=C), tanggal tidak dijamin memiliki 3 bidang di lokal lain.
Stéphane Chazelas
7

Secara rekursif:

find /etc -type f -name '[ac]*'

Jika Anda membutuhkan non-rekursi, Anda dapat melakukan ini dengan mudah:

find /etc/. ! -name . -prune -type f -name '[ac]*'

Atau ini, non-portable (GNU atau penemuan BSD terbaru):

find /etc -type f -maxdepth 1 -name '[ac]*'

Jika Anda ingin melakukan hal ini secara tidak sensitif, gunakan -inamesebagai ganti -name.

Chris Down
sumber
1
Perhatikan bahwa -type fini untuk file biasa . Jika sebaliknya Anda memerlukan file non-direktori, ganti dengan ! -type d(atau ! -xtype ddengan GNU findjika Anda juga ingin mengecualikan symlink ke direktori).
Stéphane Chazelas
1

Anda dapat mencoba perintah ini juga,

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'
Avinash Raj
sumber
1

Jika Anda ingin kedua direktori (bukan isi direktori) dan file, Anda dapat menggunakan printfbultin:

printf "%s\n" [ac]*

Contoh:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt
cuonglm
sumber
Bagaimana ini akan menghindari direktori, seperti yang diminta dalam pertanyaan?
Chris Down
Oh, salah baca saya. Saya pikir OP ingin direktori tetapi bukan isinya.
cuonglm
Maaf tentang hasil edit itu, salah baca sepenuhnya.
terdon
1

Non-rekursif tanpa find:

ls -pd /etc/[ac]* | grep -v '/$'

yang -pmenambahkan /pada akhir untuk direktori, yang grepmenyaring. Tentu saja tidak berfungsi untuk nama file yang berisi karakter khusus seperti baris baru.

Anthon
sumber
1

Dengan zsh:

print -rl /etc/[ac]*(.)

Akan mencantumkan file biasa (seperti -type fdalam find) yang terdaftar /etcdengan nama yang dimulai dengan aatau c. Bagian (xxx)di ujung gumpalan adalah fitur khusus zsh yang disebut kualifikasi globbing. .sebagai kualifikasi globbing berarti file biasa .

Jika glob tidak cocok, zshakan membatalkan perintah. Perhatikan bahwa pada cangkang mirip Bourne lainnya, jika glob tidak cocok, polanya akan mengembang dengan sendirinya, sehingga ls -d /etc/[ac]*dapat membuat daftar file yang dipanggil dengan salah /etc/[ac]*jika tidak ada file yang diawali dengan aatau cmasuk /etc.

print -rl /etc/[ac]*(^/)

akan mencantumkan file yang bukan dari jenis direktori dan

print -rl /etc/[ac]*(-^/)

akan mencantumkan file yang bukan dari tipe direktori setelah menyelesaikan symlink.

Stéphane Chazelas
sumber
-3

Untuk file tampilan dimulai dengan:

ls etc |  grep ^a

Untuk menampilkan file dimulai dengan c:

ls etc |  grep ^c
Raj
sumber