Saya dapat menggunakan ls -ld */
untuk mendaftar semua entri direktori di direktori saat ini. Apakah ada cara mudah yang sama untuk hanya daftar semua file biasa di direktori saat ini? Saya tahu saya bisa menggunakan find
find . -maxdepth 1 -type f
atau stat
stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-
tapi ini tidak membuatku terlalu elegan. Apakah ada cara pendek yang bagus untuk mendaftar hanya file biasa (saya tidak peduli dengan perangkat, pipa, dll.) Tetapi bukan sub-direktori dari direktori saat ini? Mendaftarkan tautan simbolis juga akan menjadi nilai tambah, tetapi bukan keharusan.
find
perintah adalah cara terbaik untuk melakukan apa yang Anda inginkan. Untuk beberapa opsi lain yang andal, Anda harus melihat ke dalam perintah spesifik shell (dan itu adalah sesuatu yang portabel)!ls -d */
, yang pendek, mudah diketik , dan mudah dimengerti. Jadi saya cukup senang dengan jawaban Ulrich Dangel, meskipun saya tidak menggunakan zsh.Jawaban:
Dengan
zsh
dan Kualifikasi Glob Anda dapat dengan mudah mengekspresikannya secara langsung, misalnya:hanya akan mengembalikan daftar file biasa atau kesalahan tergantung pada konfigurasi Anda.
Untuk direktori-non:
(akan menyertakan symlink (termasuk ke direktori), pipa bernama, perangkat, soket, pintu ...)
untuk file biasa dan symlink ke file biasa.
untuk non-direktori dan juga tidak ada symlink ke direktori.
Juga, melihat
D
kualifikasi globbing jika Anda ingin menyertakan D file ot (file tersembunyi), seperti*(D-.)
.sumber
Perintah ini mencantumkan semua file yang tidak disembunyikan yang bukan direktori (file biasa, tautan, file perangkat , dll.). Untuk juga menyertakan file tersembunyi, tambahkan
-A
opsi kels
Ini mengasumsikan tidak ada file yang memiliki karakter baris baru di namanya. Menambahkan
-q
opsi untukls
akan mengubah semua karakter yang tidak dapat dicetak termasuk baris baru ke?
, menjamin mereka berada di satu baris dan sangat cocok untuk mengumpankan ke utilitas berbasis garis sepertigrep
dan untuk mencetak pada terminal.sumber
--color=always
kels
, untuk OSX-G
.sudo chmod 777
pada akhirnya, dan saya diberi kesalahan ... Setiap bantuan sangat dihargails -pL | grep -v /
.-L
Link simbolik dereferences yang ditambahkan .ls -pdL something* | grep -v /
.-d
Opsi yang ditambahkan daftar direktori sendiri, bukan isinya, sehingga mereka akan dikeluarkan dengan benar.Untuk daftar file biasa saja:
Dengan tautan simbolis (ke semua jenis file) termasuk:
Di mana karakter pertama dari daftar menjelaskan jenis file, jadi itu
-
berarti file biasa, untuk tautan simbolikl
.Debian / Ubuntu
Cetak nama semua file yang cocok (termasuk tautan):
Dengan jalur absolut:
Cetak nama semua file
/etc
yang dimulai denganp
dan diakhiri dengand
:sumber
ls
tidak memiliki pilihan untuk melakukan itu, tetapi salah satu hal yang menyenangkan tentang unix & linux adalah bahwa pipa yang bertele-tele dan tidak elegan dapat dengan mudah diubah menjadi skrip shell, fungsi, atau alias. dan ini, pada gilirannya, dapat digunakan dalam pipa seperti halnya program lainnya.(CATATAN: ada beberapa masalah ruang lingkup dengan fungsi dan alias. Skrip tersedia untuk semua yang dapat dieksekusi yang dapat membaca dan mengeksekusi mereka. Alias dan fungsi hanya tersedia di shell saat ini - walaupun sub-shell .profile / .bashrc dll dapat mendefinisikan ulang mereka dan dengan demikian membuatnya tersedia. Juga, sebuah skrip dapat ditulis dalam bahasa apa pun - termasuk bash / sh, awk, perl, python, dan lainnya - yang mana yang terbaik untuk pekerjaan itu atau yang paling Anda kenal)
misalnya
alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'
Saya telah menambahkan xarg sehingga Anda dapat menggunakan semua
ls
opsi yang biasa digunakan , mislsf -lrS
Karena itu digunakan
find
, semua dotfiles yang biasanya tersembunyi akan ditampilkan, dan semua nama file akan diawali dengan ./ - itu adalah satu-satunya perbedaan yang akan Anda perhatikan.Anda dapat mengecualikan file dot dengan
! -iname '.*'
tetapi Anda harus memiliki dua versi alias - satu yang menampilkan file dot dan satu yang tidak.alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'
Atau, jika
lsf
skrip dan bukan alias, Anda dapat menguraikan opsi (mungkin dengan getopts atau / usr / bin / getopt atau serupa), dan mengecualikan dotfiles kecuali-a
ada.sumber
-name
sudah cukup, Anda tidak perlu-iname
.Opsi -F untuk ls menambahkan * ke executable, / ke direktori, @ ke tautan simbolik, = ke soket, dan | ke FIFOs. Anda kemudian dapat menggunakan grep untuk mengecualikan karakter file non-reguler dari output dan Anda memiliki file. Ini akan bekerja di shell apa pun, bukan hanya zsh.
Kelemahannya adalah:
@
,=
atau|
akan dikecualikan (tetapi Anda tidak harus benar-benar memiliki file dengan karakter tersebut dalam namanya)sumber
=
,@
atau|
karakter.=
umum di maildir atau nama file yang memiliki base64 atau bagian yang disandikan yang dapat dicetak.@
dalam definisi lokal, untuk alamat email dan lainnya. Jarang bagi mereka untuk muncul di akhir nama file. (hanya 31 dari 2,2 juta pada sistem ini misalnya)Manual menyatakan opsi 'f' hanya menentang 'file biasa', bukan pipa, soket atau perangkat blok / char, yang berarti Anda sudah melakukan hal yang benar.
sumber
Ini tidak terlalu singkat tetapi Anda bisa mengubahnya menjadi skrip atau alias jika Anda perlu memanggilnya dengan cepat. Menggunakan perintah ls sebagai larik input, panggil ls-ld pada setiap entri yang disalurkan ke grep untuk mengecualikan direktori dengan output yang dikirim ke nol, dan jika berhasil gema input asli:
Anda dapat membalikkan grep dan keluaran bersyarat, hasil yang sama:
sumber
\dev\null
?!?!Ini adalah utas yang agak lama, tetapi cara terbersih untuk mendaftar file saja.
sumber
touch "some file name"
untuk melihat contoh tandingan cepatls -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }'
, harus menangani file dengan spasi di dalamnya.