Alt dizinleri ve içeriklerini o dizinde listelemeden bir dizindeki dosyaları listeleme


24

Aynı dizinde bulunan alt dizinleri listelemeden bir dizindeki tüm dosyaların bir listesini oluşturmak ve bu listeyi yeni bir dosyaya yazdırmak istiyorum.

ls -d * > filelist

geçerli dizindeki tüm dosyaların bir listesini oluşturacaktır, fakat aynı zamanda mevcut dizindeki alt dizinleri de listeleyecektir. Seçeneği findkullanarak komutu denedim -maxdepth 1- ancak çıktı biçimi de dosya adlarıyla birlikte yolun çıktısını alırken bir sorundur.

Birisi lütfen bana sadece bir dizindeki dosyaların çıktı listesini üretecek, alt dizinlerin veya içeriklerinin isimlerini değil, kullanılacak başka bir komut veya seçenek söyleyebilir.


2
Burada, ls -d *yalnızca gizli dosyalar / klasörler hariç, geçerli klasördeki dosyaları ve klasörleri listeleyebilirim;
GM-Script-Writer-62850

evet, ancak bu dizindeki klasörlerin listelenmesini istemiyorum, yalnızca bu dizindeki dosyaların listelenmesini istiyorum
janet

Yanıtlar:


22

Bulma tabanlı çözüm:

find . -maxdepth 1 -type f -printf '%f\n'

Bash tabanlı çözüm:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

Beşe dayalı çözüm size bir dizin olmayan her şeyi verir; adlandırılmış yöneltmeler gibi şeyler içerecektir (muhtemelen bunu istersiniz). Özellikle sadece dosya istiyorsanız , findkomutu veya bunlardan birini kullanın :

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Bunu düzenli olarak kullanacaksanız, elbette bunu, içindeki bir takma ad içine koyabilirsiniz ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Ubuntu’dan ziyade aslında OSX’te olduğunuz yorumlarında bulunduğunuzdan, bir dahaki sefere soruları Apple veya daha genel Unix ve Linux Stack Exchange sitelerine yönlendirmenizi öneririm .


1
Gizli dosyaları eklemek isteyip istemediğinize bağlı olarak bu çözümlerin sizin için doğru olduğundan emin olun.
Kevin Wheeler,

10

Yalnızca dosya adlarını listele:

1. ls -p | grep -v / (gizli dosyalar olmadan)
 2. ls -l | grep ^ - | tr -s '' | cut -d '' -f 9 (gizli dosyalar olmadan)

 a) ls -pa | grep -v / (gizli dosyalarla)
 b) ls -la | grep ^ - | tr -s '' | cut -d '' -f (gizli dosyalarla)

Yalnızca dizinleri listele:

1. ls -p | grep / (gizlenmemiş)
 2. ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (gizlenmemiş)

 a) ls -pa | grep / (gizli)
 b) ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (gizli)

grep -v -e ^ $ sonuçtan boş satırları kaldırmak içindir.

Daha fazla detay :
ls -p flag dizinin adının sonuna '/' koymak, -R flag özyinelemeli arama için, -l bilgiyle listeleme için, -a tümüyle (gizli dosyalar dahil) bilgi ile listeleme, grep -v flag sonuç evirimi içindir ve -e regex eşleşmesi için bayrak.


7

Sadece normal dosyaları listelemek için:

ls -al | grep ^-

Sembolik bağlantılar 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ın d:

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

5

Yine başka bir çözüm, benim için işe yarayan çok kısa bir çözüm:

ls -la | grep -E '^[^d]' > files

benim için mükemmel,ls -alR |grep -E '^-'
burada

4

Gerekirse bul ve dizin adını çıktıdan çıkarmanızı öneririm:

find . -type f -maxdepth 1 | sed s,^./,,

2
-maxdepth 1herhangi bir filtreden önce gelmeli ve bu sonucu seçenekle sedbirlikte kullanmadan elde edebilirsiniz -printf, örneğin: find . -maxdepth 1 -type f -printf '%f\n'(bu, fazladan bir program kullanmaktan daha etkili olacaktır).
evilsoup

3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Başka bir olası seçenek

ls -F | grep -v '/' | sed /[@*]$// > filelist

--file-typeKlasörler (aynı zamanda sembolik bağlantıların. Ucunda bir @ sonunda koyar a / The grep -v '/'artık ile sona için (alt dizinleri kaldıran '/.') sed s/@$//Kaldırır bu satıra @. -1 basar dosya grep -v düzgün çalışacak şekilde.


cevabınız için teşekkürler. maalesef, benim için çalışmıyor, belki de yanlış şekilde yapıyorum. Bana verdiğiniz komutu kullanırsam aşağıdaki hatayı alıyorum: ls: illegal seçenek - - use: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [dosya ...] yerine * joker karakterini kullanmayı denedim --file tipi ile birlikte. Eğer açıklığa kavuşturmak istersen memnun olurum
janet

Bu komut benim için çalışıyor (13.04'te çalışıyor), hangi ubuntu sürümünü kullanıyorsunuz ?; -1Grep için önemli değil, ihtiyacınız yok; Gizli dosyaları dahil etmek istiyorsanız bu -aseçeneği kullanınls
GM-Script-Writer-62850

Aslında, bir mac üzerinde çalışıyorum. belki komut mac os x veya unix'te biraz farklıdır?
janet

1
Ayrıca deneyebilirsinizls -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower
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.