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:
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.
@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.
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'
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.
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.
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.Jawaban:
Untuk menghindari daftar isi direktori, Anda dapat:
Itu akan mencantumkan nama direktori bersama dengan nama file biasa dimulai dengan
a
atauc
.Untuk kelengkapan, solusi yang tidak melibatkan
find
mungkin:sumber
ls -d
tampaknya tepat, tetapi tampaknya pertanyaan awal menentukan bahwa tidak ada direktori yang harus terdaftar, terlepas dari ekspansi atau non-ekspansi.ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
jangan diurails
.ls
adalah permainan yang adil menurut saya./etc
sangat mungkin waras, ruang sederhana akan mematahkanls
pendekatan karena nomor bidang akan berubah. +1 untukls -ld
meskipun.LC_ALL=C
), tanggal tidak dijamin memiliki 3 bidang di lokal lain.Secara rekursif:
Jika Anda membutuhkan non-rekursi, Anda dapat melakukan ini dengan mudah:
Atau ini, non-portable (GNU atau penemuan BSD terbaru):
Jika Anda ingin melakukan hal ini secara tidak sensitif, gunakan
-iname
sebagai ganti-name
.sumber
-type f
ini untuk file biasa . Jika sebaliknya Anda memerlukan file non-direktori, ganti dengan! -type d
(atau! -xtype d
dengan GNUfind
jika Anda juga ingin mengecualikan symlink ke direktori).Anda dapat mencoba perintah ini juga,
sumber
Jika Anda ingin kedua direktori (bukan isi direktori) dan file, Anda dapat menggunakan
printf
bultin:Contoh:
sumber
Non-rekursif tanpa
find
:yang
-p
menambahkan/
pada akhir untuk direktori, yanggrep
menyaring. Tentu saja tidak berfungsi untuk nama file yang berisi karakter khusus seperti baris baru.sumber
Dengan
zsh
:Akan mencantumkan file biasa (seperti
-type f
dalamfind
) yang terdaftar/etc
dengan nama yang dimulai dengana
atauc
. Bagian(xxx)
di ujung gumpalan adalah fitur khusus zsh yang disebut kualifikasi globbing..
sebagai kualifikasi globbing berarti file biasa .Jika glob tidak cocok,
zsh
akan membatalkan perintah. Perhatikan bahwa pada cangkang mirip Bourne lainnya, jika glob tidak cocok, polanya akan mengembang dengan sendirinya, sehinggals -d /etc/[ac]*
dapat membuat daftar file yang dipanggil dengan salah/etc/[ac]*
jika tidak ada file yang diawali dengana
atauc
masuk/etc
.akan mencantumkan file yang bukan dari jenis direktori dan
akan mencantumkan file yang bukan dari tipe direktori setelah menyelesaikan symlink.
sumber
Untuk file tampilan dimulai dengan:
Untuk menampilkan file dimulai dengan c:
sumber