Ls -Al'de sadece dosya isimleri (boşluklu) nasıl verilir?


78

Bu yapıdaki sadece dosya veya dizin isimlerini yankılamalıyım:

ls -Al | while read string
do
...
done

ls -Al çıktı :

drwxr-xr-x  12 s162103  studs         12 march 28 12:49 personal domain
drwxr-xr-x   2 s162103  studs          3 march 28 22:32 public_html
drwxr-xr-x   7 s162103  studs          8 march 28 13:59 WebApplication1

Örneğin, denersem:

ls -Al | while read string
do
echo "$string" | awk '{print $9}
done

daha sonra boşluksuz sadece dosya ve dizinleri çıktılar. Dosya veya dizinde "kişisel alan" gibi boşluklar varsa, sadece "kişisel" kelimesi olacaktır.

Çok basit bir çözüme ihtiyacım var. Belki de awk'ten daha iyi bir çözüm vardır.


2
Neden sadece değil ls -Al *' '*? Ayrıştırma lsçıktısı hiçbir zaman iyi bir şeye yol açmaz .
Manatwork

1
Herhangi bir işe yarayacak bir şeye ihtiyacınız varsa * nix kullanmaktan kaçının ls -Al | while. Basit ve daha güvenilir bir yoldur for string in *; do echo "$string"; done.
forcefsck

sadece bu yapıya ihtiyacım var .. tamam, basit değil, herhangi bir çözüm!
Alex Zern

1
Neden mi gerek ls ? Ayrıştırma lsve "hepsinde çalış * nix ve bir şey olursa kırılmaz" birlikte iyi gitmez.
terdon

Yanıtlar:


97

Çıktısını gerçekten ayrıştırmamalısınızls . Eğer bu bir ev ödevi ödevi ise ve yapmanız gerekiyorsa, profesörünüz neden bahsettiğini bilmiyor. Neden böyle bir şey yapmıyorsun:

İyi...

find ./  -printf "%f\n"

veya

for n in *; do printf '%s\n' "$n"; done

...kötü...

Eğer varsa gerçekten kullanmak istiyorum ls, bunu biraz daha sağlam böyle bir şey yaparak yapabilirsiniz:

ls -lA | awk -F':[0-9]* ' '/:/{print $2}'

... ve çirkin

Yanlış, tehlikeli şekilde yapmakta ısrar ediyorsanız ve sadece bir whiledöngü kullanmak zorundaysanız , şunu yapın:

ls -Al | while IFS= read -r string; do echo "$string" | 
    awk -F':[0-9]* ' '/:/{print $2}'; done

Cidden, sadece yapma.


drwx------ 2 s162103 studs 3 oct. 9 2012 .ssh drwxr-xr-x 3 s162103 studs 6 oct. 25 09:02 .subversion drwxrwxrwt 3 s162103 studs 3 nov. 15 2012 .TempoItemsbazen
zamansız bir

1
@AlexZern Peki, bunun çıktısını ayrıştırmamanın nedenlerinden biri ls.
terdon

2
@AlexZern neden -lyine de düğmeye ihtiyacınız var ? Tek istediğin dosya isimleriyse, sadece koş ls -A. Kullanılması -lartık çıkış ayrıştırmak zorunda beri sadece hayatınızı zorlaştırır.
terdon

çünkü erişim, tarih, sahip, vb. ek bilgilere ihtiyacım var. Ve baskı dosyası ve boşluk içeren dir isimleri dışında iyi sonuç veren dev bir senaryo yazdım.
Alex Zern

3
Tamam ozaman. Burada sahip olduğumuz XY problemi . lsihtiyacın olanı elde etmenin en iyi yolu değil. Neden toplamak istediğiniz bilgileri açıklayan yeni bir soru yayınlamıyorsunuz ve bunu yapmanın yollarını önerebiliriz. Alternatif olarak, komut dosyanızı olduğu gibi kullanabilir ve yalnızca adı yazdırmak için yukarıdaki önerilerden birini kullanabilirsiniz. Ama cidden, ayrıştırma ls, bize sadece yeni bir soruda ne yapmaya çalıştığını söyle.
terdon

74

Çalışmamasının bir nedeni var mı ls -A1?

Örneğin:

$ touch file1 file2 file\ with\ spaces
$ ls -Al
total 0
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file1
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file2
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file with spaces
$ ls -A1
file1
file2
file with spaces
$

* Not: Bu büyük harf A ve bir numaradır.


4
-1 dahidir. Kullanılabilir olduğunu bilmiyordum. (Bildiğimi biliyorum. RTFM)
Tembel Kodlayıcı

Eğer dosya adlarını listelemek istiyorsanız sadece geçerli dizine için çalışan diğer dizinden ~ / projeler o zaman dosya adları yerine tam yollarını alacak demek
thecotne

Mac 10.9.5 @ thecotne sadece dosya isimlerini listeler. Hangi işletim sistemini kullanıyorsunuz?
AJP

ben bu ~ / projeler / * ls çalıştırıyorum yüce proje -A1 ls ben sadece isimleri olsun -A1 ~ / projeler için.
thecotne

3
@TheLazyCoder'ın kılavuzu okuması beklenmiyor.
c24,

41

Neden hiç kimse bu basit emirden bahsetmedi?

ls -a | sort

2
Parlak! Boruların sortçok sütunlu bloğun tek sütuna alınmasına nasıl sebep olduğu hakkında bir fikrin var mı?
msciwoj

@ msciwoj sadece boşluklarla ayrılmış herhangi bir dizeyi alır ve bunları bitiş çizgileriyle ayrılmış olarak yazdırır
Ben

MÜKEMMEL! Neden bu gerçek cevap olarak işaretlenmedi?
夏期劇場

3
Çünkü burada çalışır lsgeri döner ls -1(tek columnd çıkışı) çıkış bir terminale gitmezse (ve olmayan basılabilir karakter alıntı / değiştirme devre dışı bırakır; @Kusalananda, senin lshala yaparsa POSIX uyumlu değildir). lsçıktı zaten sıralandı. Bu nedenle, sortonu en iyi şekilde yapmak hiçbir şey yapmaz ve daha da kötüsü çıktıyı (dosya adları yeni satır karakterleri içeriyorsa) tersine çevirir veya metin olmayan dosya adları için başarısız olur. ls -a | catDaha iyi olurdu. Hatta daha da iyisi ls -A1zaten belirtildiği üzere (ve genellikle yedek istiyorsun çünkü / bir terminal görüntülendiğinde alıntı)
Stéphane Chazelas

1
@ StéphaneChazelas Noted. lsçıkış bir terminal olmadığında farklı davranır.
Kusalananda

3

Sen çıkışını ayrıştırmak olamaz lsdursun, ls -lyeni satır çünkü, bu alan bir dosya adı herhangi gibi geçerli bir karakterdir gibi. Ayrıca, bunun gibi bir çıktısı olan sembolik bağları da göz önünde bulundurmanız gerekir ... foo -> bar.

Neden -lsadece dosya ismini istiyorsan neden kullandın ?

Sadece yap:

for file in *; do
  ...
done

Nokta dosyalarını ( .ve hariç ..) eklemek istiyorsanız , kabuğa bağlı olarak:

zsh:

for file in *(ND); do
  ...
done

bash:

shopt -s nullglob dotglob
for file in *; do
  ...
done

ksh93:

FIGNORE='@(.|..)'
for file in ~(N)*; do
  ...
done

POSIXly:

for file in .[!.]* ..?* *; do
  [ -e "$file" ] || [ -L "$file" ] || continue
  ...
done


1
ls -Al | tr -s ' ' | cut -f9- -d' '

tr ile birden çok alanı tek boşluklara sıkıştırın, ardından alanları ayırmak için kesmeyi kullanabilirsiniz.




-1
ls --file *|grep ^ 

hangi dizinde hangi dosyaları gösterir.


Bunun soruyu ele aldığını sanmıyorum.
Jeff Schaller
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.