Geçerli dizindeki yalnızca normal dosyaları (ancak dizinleri değil) listele


126

ls -ld */Geçerli dizindeki tüm dizin girişlerini listelemek için kullanabilirim . Geçerli dizindeki tüm normal dosyaları listelemenin kolay bir yolu var mı? Biliyorum kullanabileceğimi biliyorum

find . -maxdepth 1 -type f

veya stat

stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-

ama bunlar bana aşırı şık davranıyor. Sadece sıradan dosyaları listelemek için güzel bir kısa yol var mı? Sembolik bağların da listelenmesi bir artı olacaktır, ancak bir zorunluluk değildir.


5
"Aşırı şık" derken ne demek istiyorsun? Bildiğim kadarıyla, findkomut ne istersen yapmanın en iyi yoludur. Bazı güvenilir diğer seçenekler için, kabuğa özgü komutları incelemelisiniz (ve bunlar taşınabilir olan herhangi bir şeydir)!
rahmu

@rahmu Benzer ls -d */, kısa, kolay yazılabilir ve anlaşılması kolay bir şey içindi . Bu yüzden, Zsh kullanmasam da Ulrich Dangel'in cevabından oldukça memnunum.
daniel kullmann

Yanıtlar:


32

zshVe Glob Qualifiers ile kolayca doğrudan ifade edebilirsiniz, örneğin:

echo *(.)

ya normal dosyaların listesini döndürür ya da yapılandırmanıza bağlı olarak bir hata verir.

Dizin olmayanlar için:

echo *(^/)

(sembolik bağlantılar (dizinler dahil), adlandırılmış borular, cihazlar, prizler, kapılar ...)

echo *(-.)

Düzenli dosyalar ve düzenli bağlantılar için sembolik bağlantılar için.

echo *(-^/)

dizin olmayanlar için de, dizinlere hiçbir şekilde benzer simgeler yoktur.

Ayrıca, D ot dosyalarını (gizli dosyaları) Ddahil etmek istiyorsanız , genelleme niteleyicisine bakın .*(D-.)


170
ls -p | grep -v / 

Bu komut, dizin olmayan tüm gizli dosyaları (normal dosyalar, bağlantılar, cihaz dosyaları vb.) Listeler . Gizli dosyaları da eklemek için, -Aseçeneğils

Dosyaların hiçbirinin adında yeni satır karakterleri olmadığını varsayar. Yeni satırlar da dahil olmak üzere yazdırılamayan tüm karakterleri , bir satırda olduklarını garantileyen ve bir terminal gibi yazdırmak gibi satır tabanlı bir yardımcı programa beslemek için çok uygun hale getirmek için bir -qseçenek eklemek .ls?grep


14
+1, bu iyi bir cevap. Yorum yapmayan yeni bir kullanıcıya oy vermek, özellikle de çalışan bir cevap verildiğinde, beni çok şok ediyor. Bunun düzgün çalışmadığını görebildiğim tek vaka, dosya adında yeni bir satır varsa. Ayrıca renkleri korumak, desteklendiğinde hoş bir ek olacaktır. GNU için eklemek olabilir --color=alwaysiçin lsOSX için, -G.
Graeme

Merhaba, verdiğiniz komut harika ve kesinlikle bana yardımcı oluyor, ancak yukarıdaki komutu kullanıp aynı anda dosya iznini değiştirmenin mümkün olup olmadığını merak ediyordum. sudo chmod 777Sonunda eklemeye çalıştım ve bana hatalar verildi ... Herhangi bir yardım büyük beğeni topluyor
dissidia

3
Ayrıca dizinlere işaret eden sembolik işaretleri hariç tutmak isterseniz ls -pL | grep -v /. Eklenen -Lbaşvurular sembolik bağlantılar.
Matthias Braun

1
Ayrıca joker karakter filtresi kullanmaktan hoşlanıyorsanız, yapın ls -pdL something* | grep -v /. Eklenen -dseçenek, içeriklerini değil, dizinleri listeler, bu nedenle doğru şekilde hariç tutulurlar.
Rockallite

Ve eğer klasörleri olmayan tüm dosyaları almak istiyorsanız, sadece -v
jasonleonhard 10:17

23

Sadece normal dosyaları listelemek için:

ls -al | grep '^-'

Sembolik bağlarla (herhangi bir dosya türüne) dahil:

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

Listenin ilk karakterinin dosya türünü tanımladığı yerde -, sembolik bağlantı için normal bir dosya olduğu anlamına gelir l.

Debian / Ubuntu

Tüm eşleşen dosyaların adlarını yazdırın (bağlantılar dahil):

run-parts --list --regex . .

Mutlak yollarla:

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

Şununla /etcbaşlayan pve biten tüm dosya adlarını yazdır d:

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

15

lsbunu yapma seçeneği yoktur, ancak unix & linux ile ilgili güzel şeylerden biri, uzun soluklu ve inelegant boru hatlarının kolayca bir kabuk betiği, işlevi veya diğer adı haline getirilebilmesidir. ve bunlar, sırayla, diğer programlardaki gibi boru hatlarında da kullanılabilir.

(NOT: Fonksiyonlar ve takma isimlerle ilgili bazı kapsam sorunları vardır. Komut dosyaları, bunları okuyabilen ve çalıştırabilen herhangi bir çalıştırılabilir dosya için kullanılabilir. Takma adlar ve işlevler yalnızca geçerli kabukta kullanılabilir - bir alt kabuğun .profile / .bashrc vb. onları ve böylece onları kullanılabilir hale getirir.Ayrıca, herhangi bir dilde - bash / sh, awk, perl, python ve diğerleri dahil olmak üzere herhangi bir dilde yazılabilir - hangisi iş için en iyisi veya hangisine aşina olursanız olun)

Örneğin

alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'

Tüm geleneksel lsseçenekleri kullanabilmeniz için xargs ekledim.lsf -lrS

O kullandığından find, normalde gizli dotfiles tüm görüntülenir ve dosya adları tüm ./ öneki getirilecek - o göreceğiniz tek fark hakkında.

Nokta dosyalarını hariç tutabilirsiniz, ! -iname '.*'ancak sonra takma adın iki sürümüne sahip olmanız gerekir;

alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'

Alternatif olarak, lsfbir takma ad yerine bir komut dosyası olsaydı , seçenekleri (belki getopts ya da / usr / bin / getopt ya da benzerleriyle) ayrıştırabilir ve -amevcut olmadıkça nokta dosyalarını hariç tutabilirsiniz .


-nameyeter, gerek yok -iname.
Totor,

8
bash-4.2$ ls -F | grep -v '[/@=|]$' | more

-S seçeneği -s, çalıştırılabilir dosyalara, / dizinlere, @ sembolik bağlara, = soketlere ve | FIFO'lara. Normal olmayan dosya karakterlerini çıktıdan çıkarmak için grep'i kullanabilirsiniz ve dosyalara sahipsiniz. Bu sadece zsh değil, herhangi bir kabukta çalışacaktır.

Zayıflıklar:

  1. Adını herhangi bir dosya biter @, =ya da |hariç tutulacaktır (ama gerçekten yine adına bu karakterlerle dosyalar olmamalıdır)
  2. Bu, kapılar gibi bazı sistemlerde aygıt dosyalarını veya bazı egzotik dosya türlerini dışlamaz.
  3. Çalıştırılabilir herhangi bir dosyaya eklenmiş bir yıldız olacak. Çıktıdaki '*' karakterlerini kaldırmak için sed aracılığıyla borulama ile ele alınabilir.
  4. Yeni satır karakterleri içeren dosya adları varsa, bu düzgün çalışmaz.

Sistemde Bu konuda yazıyorum, dosyaların% 10 adlarını içeren var =, @ya da |karakterleri. =base64 veya kote-yazdırılabilir kodlanmış kısmı olan maildir veya dosya isimlerinde yaygındır. @yerel tanımlarda, e-posta adresleri ve daha fazlası için. Ancak dosya adının sonunda görünmeleri nadirdir. (örneğin bu sistemde 2,2 milyondan sadece 31)
Stéphane Chazelas

3

Kılavuz, 'f' seçeneğinin sadece borulara, sokete veya blok / char cihazlarına değil, 'normal dosyaya' karşı olduğunu belirtti, bu da zaten doğru şeyi yaptığınız anlamına gelir.

   -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)

0

Bu, özellikle kısa değildir, ancak hızlı bir şekilde çağırmanız gerekirse, onu bir komut dosyasına veya diğer adaya dönüştürebilirsiniz. Bir giriş dizisi olarak ls komutunu kullanarak, çıktısı null değerine sahip olan dizinleri dışlamak için grep yapmak üzere grep yapmak için her girişte ls -ld komutunu kullanın ve başarılı olursa orijinal girişi yankılanır:

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

Grep ve koşullu çıktıyı ters çevirebilirsiniz, aynı sonuçlar:

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

\dev\null?!?!
Manat çalışması


0

Bu biraz eski bir iş parçacığı, ancak yalnızca dosyaları listelemek için en temiz yoldur.

ls -al | grep '^-' | awk '{print $9}'


1
touch "some file name"hızlı bir karşı örnek görmek için
Jeff Schaller

@JeffSchaller Geçerli bir noktanız var. Bunun için böyle bir şey. ls -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }', içerisinde boşluk bulunan dosyaları işlemelidir.
RJ,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.