Dosyaları listelerken dizinleri nasıl hariç tutarım?


21

Geçerli dizindeki dosyaları listelerken dizinleri nasıl hariç tutarım?

ls .

^ listede dizinleri içerecektir.

Yanıtlar:



15

Tam olarak eşdeğer olmasını ls .sağlamak için gizli dizinleri göstermemelisiniz.

find . -maxdepth 1 -not -type d -and -not -name '.*'

ve bu hala her dosya adına önek olarak "./" işareti bırakır. Bu gerçekten bir sorun değil, ama sanırım biraz çirkin. İle gittim:

ls -p | grep -v '/$'

Bu size aynı görünen bir liste sunar ve siz de ek lsargümanlar ekleyebilirsiniz . Bir ekleyin --color=alwaysve dircolors geri almak veya -agizli dosyaları görmek için.

Alexander'ın cevabını seviyorum çünkü aslında söz konusu dosyanın karakteristik bir dosya sistemi özelliğine bağlı, bu yüzden hiç kandırılmayacak. Cevabım, adındaki son karakter olarak '/' olan bir dosya tarafından aldatılacak. Ama sanki sorun istiyor.


1
'-not' GNU bulmayla ilgilidir, çünkü POSIX uyumlu değildir, bir kullanıcı "kötü" alışkanlıklara sahip olabilir ve diğer
UNIX'lerde

2
@JiriXichtkniha -not'a POSIX alternatifi nedir?
Lucas Gallindo

5

bunu dene:

$ find. -tip f -maxdepth 1

veya bu:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d


3

Eski bir yazı olmasına rağmen, bunun yardımcı olabileceğini düşündüm.

$ ls -l | grep -v ^ d

Semboller, karakter ve blok dosyaları dahil tüm dosyaları listeler.


Bu cevap zaten bir yıl önce Jamzed tarafından sağlandı, (bu görsel gürültüyü yapıyor.)
Alexx Roche

2

Yukarıdaki "find" çözümleri ls bazı yeteneklerini kaybeder - örneğin: sadece azalan değiştirme süresine göre sıralanmış dosyaları listeler.

"Ls -p | grep" cevapları istenirse -R gibi diğer ls unsurlarıyla zarif bir şekilde ilgilenmez.

Aşağıdaki cevap, daha ayrıntılı olsa da, bence en gerçek ls davranışını ve "yalnızca dosyaları" seçmek için en esnekliği yansıtır

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

Basitçe ls anahtarlarını istediğiniz gibi değiştirin; sonuç yalnızca dosyalarla döndürülecektir. Bağlantılar ve diğer öğeler de gerekliyse, dahil edilmek üzere test için küçük yeniden çalışmaların yapılması gerekecektir.


0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

Bununla, lsgenellikle alır diğer seçenekleri kullanabilirsiniz . Veya ... -vsadece dizinleri listelemek için kaldırın . Veya ... dizini file, ASCII, boş, ELF vb. Gibi anlayan ve bildiren diğer dosya türleriyle değiştirin .


Listelenecek dosya adlarından herhangi birinde boşluk varsa bu çalışmaz.
Psychonaut

ls -t .|while read f;do [ -f "$f" ]&& echo $f;donetestlerimde yaklaşık 3 kat daha hızlı
Alexx Roche

0

Ben findikili desteklemediği bir sistemdeydim -notve kullanarak sona erdi:

ls|while read f;do [ -f "$f" ]&& echo $f;done

Avantajları: sh ls echo
Bash ve tire ile uyumlu başka hiçbir şeye güvenmez
Başka şeylerle (dizinler gibi) değiştirilerek değiştirilebilir -f
Bazı cevaplardan daha hızlıdır ve daha az RAM ve CPU kullanır

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.