Daftar hanya file biasa (tetapi bukan direktori) dalam direktori saat ini

126

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.

daniel kullmann
sumber
5
Apa yang Anda maksud dengan "terlalu elegan"? Sejauh yang saya tahu, findperintah 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)!
rahmu
@rahmu aku untuk sesuatu yang mirip ls -d */, yang pendek, mudah diketik , dan mudah dimengerti. Jadi saya cukup senang dengan jawaban Ulrich Dangel, meskipun saya tidak menggunakan zsh.
daniel kullmann

Jawaban:

32

Dengan zshdan Kualifikasi Glob Anda dapat dengan mudah mengekspresikannya secara langsung, misalnya:

echo *(.)

hanya akan mengembalikan daftar file biasa atau kesalahan tergantung pada konfigurasi Anda.

Untuk direktori-non:

echo *(^/)

(akan menyertakan symlink (termasuk ke direktori), pipa bernama, perangkat, soket, pintu ...)

echo *(-.)

untuk file biasa dan symlink ke file biasa.

echo *(-^/)

untuk non-direktori dan juga tidak ada symlink ke direktori.

Juga, melihat Dkualifikasi globbing jika Anda ingin menyertakan D file ot (file tersembunyi), seperti *(D-.).

Ulrich Dangel
sumber
170
ls -p | grep -v / 

Perintah ini mencantumkan semua file yang tidak disembunyikan yang bukan direktori (file biasa, tautan, file perangkat , dll.). Untuk juga menyertakan file tersembunyi, tambahkan -Aopsi kels

Ini mengasumsikan tidak ada file yang memiliki karakter baris baru di namanya. Menambahkan -qopsi untuk lsakan 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 seperti grepdan untuk mencetak pada terminal.

Athul Biju
sumber
14
+1, ini adalah jawaban yang bagus. Tidak memilih pengguna baru tanpa komentar cukup mengejutkan bagi saya, terutama ketika jawaban yang diberikan berhasil. Satu-satunya kasus tepi yang bisa saya lihat di mana ini tidak akan berfungsi dengan baik adalah jika ada baris baru dalam nama file. Juga mempertahankan warna akan menjadi tambahan yang bagus jika didukung. Untuk GNU Anda bisa menambahkan --color=alwayske ls, untuk OSX -G.
Graeme
Hai, perintah yang Anda berikan sangat bagus dan tentu saja membantu saya, tetapi saya bertanya-tanya apakah mungkin untuk menggunakan perintah di atas dan mengubah izin file pada saat yang sama? Saya mencoba menambahkan sudo chmod 777pada akhirnya, dan saya diberi kesalahan ... Setiap bantuan sangat dihargai
dissidia
3
Jika Anda juga ingin mengecualikan symlink yang mengarah ke direktori lakukan ls -pL | grep -v /. -LLink simbolik dereferences yang ditambahkan .
Matthias Braun
1
Jika Anda juga suka menggunakan filter wildcard, lakukan ls -pdL something* | grep -v /. -dOpsi yang ditambahkan daftar direktori sendiri, bukan isinya, sehingga mereka akan dikeluarkan dengan benar.
Rockallite
Dan jika Anda ingin mengambil semua file tanpa folder cukup hapus -v
jasonleonhard
23

Untuk daftar file biasa saja:

ls -al | grep '^-'

Dengan tautan simbolis (ke semua jenis file) termasuk:

ls -al | grep '^[-l]'

Di mana karakter pertama dari daftar menjelaskan jenis file, jadi itu -berarti file biasa, untuk tautan simbolik l.

Debian / Ubuntu

Cetak nama semua file yang cocok (termasuk tautan):

run-parts --list --regex . .

Dengan jalur absolut:

run-parts --list --regex . "$PWD"

Cetak nama semua file /etcyang dimulai dengan pdan diakhiri dengan d:

run-parts --list --regex '^p.*d$' /etc
kenorb
sumber
15

lstidak 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 lsopsi 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 lsfskrip dan bukan alias, Anda dapat menguraikan opsi (mungkin dengan getopts atau / usr / bin / getopt atau serupa), dan mengecualikan dotfiles kecuali -aada.

cas
sumber
-namesudah cukup, Anda tidak perlu -iname.
Totor
8
bash-4.2$ ls -F | grep -v '[/@=|]$' | more

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:

  1. File apa pun yang namanya berakhir @, =atau |akan dikecualikan (tetapi Anda tidak harus benar-benar memiliki file dengan karakter tersebut dalam namanya)
  2. Itu tidak mengecualikan file perangkat atau beberapa jenis file eksotis di beberapa sistem seperti pintu.
  3. Anda akan memiliki tanda bintang yang ditambahkan pada file apa pun yang dapat dieksekusi. Itu bisa ditangani dengan mem-pip melalui sed untuk menghapus karakter '*' dari output.
  4. Itu tidak berfungsi dengan baik jika ada nama file yang mengandung karakter baris baru.
kurtm
sumber
Pada sistem saya menulis ini, 10% dari file memiliki nama yang mengandung =, @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)
Stéphane Chazelas
3

Manual menyatakan opsi 'f' hanya menentang 'file biasa', bukan pipa, soket atau perangkat blok / char, yang berarti Anda sudah melakukan hal yang benar.

   -type c
          File is of type c:

          b      block (buffered) special

          c      character (unbuffered) special

          d      directory

          p      named pipe (FIFO)

          f      regular file

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)
bunga aster
sumber
0

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:

for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ;

Anda dapat membalikkan grep dan keluaran bersyarat, hasil yang sama:

for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ;
Don R
sumber
\dev\null?!?!
manatwork
0

Ini adalah utas yang agak lama, tetapi cara terbersih untuk mendaftar file saja.

ls -al | grep '^-' | awk '{print $9}'
RJ
sumber
1
touch "some file name"untuk melihat contoh tandingan cepat
Jeff Schaller
@ JeffSchaller Anda memiliki poin yang valid. Untuk sesuatu seperti ini. ls -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }', harus menangani file dengan spasi di dalamnya.
RJ