Ls komutundan yalnızca bir çıktı sütununu nasıl eko ederim?


54

Diyelim ki, ls komutunu verdiğimde çıktı:

file1 file2 file3 file4

Bu durumda yalnızca belirli bir çıktı sütununu görüntülemek mümkün mü? Aşağıdakileri başarılı olmadan denedim:

echo ls | $2

Temelde tek istediğim sadece ikinci sütunu yankı yapmak, bu durumda yankı yapmak istiyorum:

file2

2
Eğer gerçekten bir istediğiniz bir durum nedir sütunu içinde lsçıkışı?
michas

11
Genel bir kural olarak, asla ayrıştırmamalısınız . İhtiyacınız olan bilgiyi elde etmenin neredeyse her zaman daha iyi yolları vardır.
terdon

Bu yabancıyı yapmam: P (özür dilerim ben her zaman bu cümleyi sevdim) sütun sayısı dosya ve klasörlerin isimlerine bağlıdır, bu yüzden 2. sütun istediğiniz sütun olabilir, olmayabilir veya birinde olabilir lsve bazı dosyalar / klasörler oluşturduktan sonra artık istediğiniz şey olmayabilir. Terdon'un belirttiği gibi istediğini elde etmenin daha iyi yolları var
YoMismo

Yanıtlar:


81

Aşağıdaki komut ls çıktısını bir sütuna biçimlendirir

ls -1 /directory

2
Ama OP'nin ilgilendiği tek bir sütun vermez.
Anthon

1
Bunu düzeltmek için: ls -1 /directory | head -2 | tail -1ya dals -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'daha basit görünüyor
Fiximan

3
Aradığım cevap OP sorusu için değil.
Michael Lang

36

Bunu arıyorsun:

ls -C | awk '{ print $2 }'

Ancak, daha sonra bu dosya adını kullanmaya çalışacağınızı varsayarsak, boşluk bırakmayan dosya adlarını kıracağından bunu yapmayın. Bunun yerine, dosyaları bir diziye yerleştirin ve ikincisini alın; bu da ayrıştırma yapmaktan kaçınmasını engeller:

files=(*)
printf '%s\n' "${files[1]}"

Dosyaları geri aldığınız sıra, değerine bağlıdır LC_COLLATE. Bu nedenle, LC_COLLATE=Ctüm köşe durumlarda bir "standart" sıralama istiyorsanız, ilk olarak ayarlamak isteyebilirsiniz.


Dizi indekslerinin 1hassas kabuklarda (zsh, yash, balık, csh, tcsh, rc, es ...) ve 0ksh ve bash'da başladığına dikkat edin . Tüm Bourne benzeri mermilere taşınabilir bir çözüm için, şunları kullanabilirsiniz: set -- *; printf '%s\n' "$2"bunun yerine.
Stéphane Chazelas,

@ StéphaneChazelas Bu soru için en azından etiketlerde "bash" bulunur, bu nedenle bu cevap o kabuğa özgüdür.
Chris Down,

ls -C | awk '{print $ 1}, aynı çıktıyı verir ... neden $ 2?
boctulus

7

Sen eklemeniz gerekir -Colarak lsçıktı bir terminal olmadığı zaman tek sütunlu modunu kullanır. awksonra ikinci sütunu yazdırır:

ls -C | awk '{print $2}'

2

Sanırım aradığın

ls -1

Tek sütunda izin, sahip, grup, tarih, boyut ... gibi basit dosya adını göstermez.


1
Sadece bu cevap yanlış değil, daha önce de verildi.
Scott

Bunun asıl soru için yanlış olduğunu fark etmeme rağmen, aradığım şey buydu. Öyleyse teşekkür ederim.
AntumDeluge,

0

Benim için çalışmanın tek yolu "-all" eklemesi. Yani:

ls -C -all | awk '{ print $1 }'

Çünkü -allkullanıcı, izinler vb. Daha fazla sütun ekleyin.


0

Daha önce de belirtildiği gibi - lsçıktıyı ayrıştırmak için sütunların kullanılması çok sağlam değildir çünkü lssatırları dosya adınızın uzunluklarına ve terminal genişliğine göre keser. Öğelerin bir listesinin tek bir sütununu görüntülemek sık sık ilginçtir. Cut komutunu kullanarak bunu yapabilirsiniz:

echo file1 file2 file3 file4 | cut -d" "  -f2

gösterecek

file2

Not -dile örneğin öyleyse, sütun sınırlayıcı seçmek için izin verir

cur -d, -f2

virgülle ayrılmış listenin ikinci sütununu görüntüleyebilirsiniz.


0

Varsayalım ki şu anki yolun altında sadece belirli bir dosya adını göstermek istiyorsanız aşağıdaki komutu kullanın.

komut:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

Bu zor, çünkü ayrıştırma ls -Cşunlara bağlıdır:

  1. dosya adı uzunluğu, (kendisi kendisine belirtilen dosya listesine bağlı olarak değişir ls -C)
  2. terminal genişliği
  3. ls -Cçıktının sütunlu olduğu, ancak alan ayırıcı olarak değişen sayıdaki boşluğa göre yapılandırılmış olabileceği gerçeği .
  4. dosya isimlerinde boşluk gösterme olasılığı (ekran, lsseçilen belirli ekran seçeneklerine bağlıdır ).

Şimdilik, en kolay sorunla başlayalım, ( yani yukarıda değil # 4), supposing var olduğunu Dosya adlarında hiçbir boşluk . 2 numaralı sütunu yazdırmak için bu çalışır:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

Bunu açarak:

  • COLUMNS=$COLUMNSbeslenen sütun uzunluğunun | mevcut terminal ekranı ile tutarlı kalmasını garanti eder . Bunu keyfi bir değere değiştirmek de işe yarıyor, COLUMNS=50ya COLUMNS=70 da ls -Cişlerin bu genişliklere göre yeniden düzenlenmesine neden oluyor.

    Başka bir yöntem, -wanahtarı kullanmak olacaktır , örneğin :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • tralan ayırıcıları tutarlı kılar: her sütun arasında tek bir sekme .

  • cut istenen sütunu çıkarır.


Boş alan yöntemi beklemede ...
agc

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

karakter sayısını (54) gerektiği gibi değiştirin, böylece yalnızca istediğiniz verileri elde edersiniz.


2
netleştirmek için, 54-54. pozisyondan başlayarak her karaktere kesim söyler; "insan tarafından tanınan" bir sütunda durmuyor
Jeff Schaller

Kötü bir fikir değil ... sadece rafine edilmesi gerekiyor.
prusswan
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.