Saya memiliki direktori di mana saya ingin mendaftar semua konten (file dan sub direktori) tanpa menunjukkan tautan simbolik. Saya menggunakan utilitas GNU di Linux. The ls
versi 8.13.
Contoh:
Daftar direktori lengkap:
~/test$ ls -Gg
total 12
drwxrwxr-x 2 4096 Jul 9 10:29 dir1
drwxrwxr-x 2 4096 Jul 9 10:29 dir2
drwxrwxr-x 2 4096 Jul 9 10:29 dir3
-rw-rw-r-- 1 0 Jul 9 10:29 file1
-rw-rw-r-- 1 0 Jul 9 10:29 file2
lrwxrwxrwx 1 5 Jul 9 10:29 link1 -> link1
lrwxrwxrwx 1 5 Jul 9 10:30 link2 -> link2
Apa yang ingin saya dapatkan
~/test$ ls -somthing (or bash hack)
total 12
dir1 dir2 dir3 file1 file2
CATATAN: Motivasi utama saya adalah untuk melakukan grep rekursif (GNU grep 2.10) tanpa mengikuti symlink.
grep
(lihat paragraf terakhir).grep -H
, jika Anda memilikinya (lihatman grep
), ataugrep 'pat' '{}' /dev/null ';'
untuk menjebaknya dengan berpikir ada beberapa file jika tidak.+
gagal memenuhi persyaratan itu dalam kasus degenerate di mana hanya ada satu file atau satu file tersisa di akhir.Atau, lebih sederhana:
Penjelasan
ls -l
berarti daftar dalam bentuk panjang . Ketika Anda melakukan ini, string karakter pertama memberikan informasi tentang setiap file. Karakter pertama menunjukkan tipe setiap file. Jika itu symlink, maka al
adalah karakter pertama.grep -v ^l
artinya menyaring (-v
) baris yang dimulai dengan (^
) anl
.sumber
for i in
-l
masukls
. Jadi ini tidak akan berfungsi seperti yang diharapkan:ls | grep -v ^l
find
, lihat unix.stackexchange.com/questions/321697Dari versi 2.12 dan seterusnya,
-r
opsi untuk GNU grep tidak menampilkan tautan simbolik kecuali jika Anda menetapkannya dengan tangan:sumber
-R, -r, --recursive Read all files under each directory, recursively; this is equivalent to the -d recurse option.
di 2.10Di zsh, ini akan mudah berkat kualifikasi global :
Pola ini
**/
melintasi subdirektori secara rekursif. Kualifikasi glob.
membatasi pencocokan dengan file biasa.Tanpa zsh, gunakan
find
(lihat jawaban Michael Horner ). Dan dalam kasus khusus ini, GNU grep dapat melakukan apa yang Anda inginkan (itu persis apa yanggrep -r
dilakukan) - tetapi hanya sejak versi 2.12, versi sebelumnya memang mengikuti tautan simbolis.sumber
Anda dapat menggunakannya
$LS_COLORS
untuk melakukan ini. Jika versils
dukungan Anda menentukan warna menggunakan variabel itu, Anda dapat menentukan output per jenis file. Itu perilaku bawaan dan sangat dapat dikonfigurasi. Jadi saya membuat beberapa file untuk demo ini seperti:Jadi sekarang saya akan lakukan:
Dan null ada di sana juga ...
Anda dapat menentukan untuk semua atau semua tipe file. Melakukannya hanya untuk satu tipe file mungkin tidak sesuai keinginan Anda karena
ls
telah memasukkan beberapa nilai kompilasi default untuk lolos dari terminal. Anda akan melakukan jauh lebih baik untuk mengatasi api sebagai satu antarmuka. Berikut adalah sedikit cara sederhana untuk mem-parsing dan menetapkan lingkungan yangdircolors
dikonfigurasi secara default saat ini:Outputnya di direktori home saya terlihat seperti ini:
Anda dapat menjalankannya
cat -A
juga dan satu-satunya perbedaan yang akan Anda temui adalah Anda akan melihat$
baris baru - tidak ada karakter yang tidak diinginkan yang diperkenalkanls --color=always
dengan konfigurasi ini - hanya yang Anda lihat di sini.ls
sisipan terminal defaultnya lolos seperti ini:... di mana nilai default untuk
$lc
(kiri kode) ,$rc
(kanan kode) , dan$rs
(reset) adalah:... masing-masing.
${type_code}
digunakan untuk menggantikan berbagaifi
(file biasa - default tidak disetel) ,di
(direktori) ,ln
(tautan) , dan setiap jenis file lain yang saya ketahui. Ada juga$no
(normal) yang juga secara default tidak disetel dan yang di sini diwakili oleh//
pada awal setiap baris.IFS=:
Blok kecil sederhana saya berfungsi hanya dengan menyisipkan nama untuk setiap yang dapat dikonfigurasi juga sebagai nilainya sendiri dan menambahkan satu atau dua garis miring - meskipun\0
byte NUL juga akan berlaku.Secara default
ls
juga akan menyisipkan satu$rs
segera sebelum output pertama$lc
- tetapi ini tidak diwakili secara akurat di sini. Dalam hal ini saya telah menentukan$ec
(kode akhir) yang berlaku dalam$rs
semua kasus - ketika ditentukan Anda tidak mendapatkan tambahan di$rs
antara$no
dan${type_code}
seperti yang Anda inginkan - hanya menyajikan segera mengikuti nama file dan sekali pada awal output - seperti yang Anda lihat dalam satu tebasan ekstra di baris pertama.Ini cuplikan dari saya sendiri
$LS_COLORS
Dan, sebenarnya, hack shell kecil saya mungkin terlalu rumit - ada antarmuka yang tersedia secara luas untuk menetapkan nilai-nilai ini. Coba
dircolors -p
di cli Anda daninfo dircolors
untuk informasi lebih lanjut tentang itu.Anda dapat membungkus nama file dalam string acak. Anda dapat berkomentar jika Anda mau. Anda dapat menentukan perilaku serupa hanya berdasarkan ekstensi file. Benar-benar tidak banyak yang tidak bisa Anda tentukan dengan cara itu.
Sekarang saya tidak hanya mengada-ada semua ini - saya mempelajarinya setelah menemukan kode sumber secara tidak sengaja.
Dengan konfigurasi khusus ini
ls
akan memancarkan:$no
- Satu kali per record di awal setiap record${type_code}
- Sekali segera sebelum setiap nama file untuk menyertakan singkatan dari jenis file dan selalu terjadi pada baris yang sama seperti dan 7 spasi putih dibatasi bidang setelah$no
atau segera setelah->
menunjukkan target tautan simbolis.$ec
- Sekali segera sebelum baris pertama dan setelah itu hanya sekali segera mengikuti setiap nama file.Semua nilai lainnya kosong.
Berikut ini adalah nol-dibatasi
ls
, dan kali ini saya akan menggunakancat -A
, meskipun, tanpa itu, akan terlihat sama dengan contoh terakhir:Dan untuk menghapus semua tautan simbolis dari
-l
daftar ong seperti ini dengan andal , Anda dapat melakukan perubahan sederhana:Hasil saya setelah menjalankan yang terlihat seperti ...
Menggunakan beberapa perintah seperti yang saya lakukan di atas:
... (di mana
fc1
danfc2
merupakan tipe file yang terdaftar setelahset --
dalam subkulit) harus berfungsi untuk menghapus semua kombinasi tipe file yang Anda inginkan darils
output terlepas dari karakter apa pun yang mungkin berisi nama file.sumber
lc
,nc
, dll?ls
itudi=
. Anda harus menambahkandi=:
var untuk membatalkannya - dan untuk semua yang lain. Itu yang saya maksud dengan api - Anda alamat setiap jenis file tetapi Anda harus alamat antarmuka yang sama dalam semua kasus. Jadi pengaturanln
satu arah dan mengabaikandi
standar tidak akan berhasil. Ada banyak standar yang dikompilasi juga ... Hmm. Meminta Anda tentanglc
dannc
dan hal-hal berlaku - benar - saya sudah melakukannya hari lain sekalipun. Saya akan menghubungkannya, saya pikir.dircolors
. Bunyinya file konfigurasi dan menampilkaneval
nilai var yang mudah digunakan. Ini cukup mudah - tetapi begitu juga beberapa baris di sana. Lagi pula, jika Anda ingin menggunakandircolors
Anda hanya menyimpan dua file yang berbeda dan memohon seperti itu. Juga, saya menunjukkan kepada Anda suatu hari bagaimana melakukan keduanya sekaligus dengan\0
pembatas NUL sebagai bagian dari setiap urutan pelarian.LS_COLORS='rs=:no=\0//:lc=:rc=:ec=\0//:'$( set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex; for fc do printf %s "$fc=/$fc//\0:"; done) ls -l --color=always | cat -A
Jawaban di atas mengarah pada yang berikut:
Anehnya meninggalkan 1 dari perintah ls masih memberikan daftar.
sumber
grep -i
? Bukannya/
bisa menjadi huruf besar atau huruf kecil.ls
default ke format noe-kolom ketika output bukan terminal (itu pipa di sini).Coba yang ini:
sumber
a -> b
. Ini juga akan gagal pada nama file dengan baris baru dan keanehan lainnya. Baca ini untuk alasan mengapa mem-parsing adalah ide yang buruk.ls
aliasls -l
, dan ini mengembalikan kolom sebelum nama file, atau tidak, dan ini tidak melakukan sesuatu yang istimewa tentang tautan simbolik.ls
mem - parsing sendiri. kita semua menguraikanls
setiap kali kita mencetak ke terminal - ada api . Saya mengirim jawaban yang menunjukkan sesuatu seperti itu di sini - tetapi Anda dapat melakukan lebih banyak lagi. Saya menunjukkan kepada Anda beberapa hari yang lalu - Anda memiliki nama file nol-dibatasi sendiri.ls
tidak akan memakan anak-anak Anda atau apa pun - itu hanya sebuah program. Jika Anda tidak menjelaskannya maka akan memakan waktu beberapa ratus untuk menjelaskan hal itu dan beberapa ratus lebih untuk menjelaskan mengapa beberapa ratus baris Anda hanya terkait dengan salah. Dan selain itu - ini hanya dua baris:LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \ ls -1 --color=always | cat
Coba perintah ini:
ls -p | grep -v @
sumber
find -type f
-p
baru saja menambahkan garis miring ke direktori, Anda mencari-F
ii)find
alternatif Anda tidak akan mendaftar direktori dan iii) Silakan menguji jawaban Anda sebelum memposting.