Ls -l çıktısının her satırı üzerinde yineleme


120

Aşağıdakinin çıktısındaki her satırı yinelemek istiyorum: ls -l /some/dir/*

Şu anda deniyorum: for x in $(ls -l $1); do echo $x; done

Ancak bu, satırdaki her bir öğeyi ayrı ayrı yineler, dolayısıyla şunu elde ederim:

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2

Ama yine de her satırı bir bütün olarak yinelemek istiyorum. Bunu nasıl yaparım?


1
Yapmamak için belirli bir nedeniniz olmadıkça her zaman değişkenleri (ve komut çıktısını) tırnak içine alın.
glenn jackman

Yanıtlar:


247

IFS'yi yeni satıra ayarlayın, şöyle:

IFS='
'
for x in `ls -l $1`; do echo $x; done

IFS'yi kalıcı olarak ayarlamak istemiyorsanız etrafına bir alt kabuk koyun:

(IFS='
'
for x in `ls -l $1`; do echo $x; done)

Veya while kullanın | bunun yerine okuyun:

ls -l $1 | while read x; do echo $x; done

While / read işlevini aynı kabuk düzeyinde çalıştıran bir seçenek daha:

while read x; do echo $x; done << EOF
$(ls -l $1)
EOF

12
Süre için boru yaparken dikkat iken ana proses değişkenleri değiştirmek olması demektir bir kabuktaki, yayınlanır
reorx

1
1 doların burada ne işi var? Bunu, argümanları kabul eden, yazdığım bir senaryoda kullanmam gerekiyor. 1 dolar bir şeyleri fırlatıyor. Aynı etkiyi elde etmek için 1 $ yerine oraya ne koyabilirim? İkinci çözümü kullanmak istiyorum.
noob-in-need

@ noob-in-need
Listelemek

1
Yapmak isteyebilirsiniz, read -raksi takdirde bash, verilerden çıkış karaktersiz ters eğik çizgileri çıkarır.
Brian Gordon

6

Her satırda ne yapmak istediğinize bağlıdır. awk, bu tür işlemler için kullanışlı bir yardımcı programdır. Misal:

 ls -l | awk '{print $9, $5}'

.. sistemimde dizindeki her bir öğenin adını ve boyutunu yazdırır.


3

Daha önce de belirtildiği gibi awk bunun için doğru araçtır. Awk kullanmak istemiyorsanız, "ls -l" çıktısını satır satır ayrıştırmak yerine, tüm dosyaları yineleyebilir ve her bir dosya için aşağıdaki gibi bir "ls -l" yapabilirsiniz:

for x in * ; do echo `ls -ld $x` ; done

3

Ayrıca findkomutu deneyebilirsiniz . Yalnızca geçerli dizindeki dosyaları istiyorsanız:

find . -d 1 -prune -ls

Her biri için bir komut çalıştırmak mı?

find . -d 1 -prune -exec echo {} \;

Satırları say, ancak yalnızca dosyalarda mı?

find . -d 1 -prune -type f -exec wc -l {} \;


bul bozuldu. Çoğunlukla tuhaf hata mesajları al. komut satırı tamamen geçerli olduğunda bana yardım etmek istiyor ve bunu yapmaya başladığında, bir sonraki MAYBE yeniden başlatılana kadar durmayacak gibi görünüyor. bazen doğası gereği hatalarla ilgili rastgele görünür. hatayı nasıl bildirebileceğimden emin değilim.
Jim Michaels

1

Ls (1) komutunun çıktı yeniden yönlendirmesiyle birlikte read (1) yardımcı programı istediğinizi yapacaktır.


-1

Öyleyse neden kimse işlemek istemediği parçaları ortadan kaldıran seçenekleri kullanmayı önermedi.

Modern Debian'da dosyanızı şununla alırsınız:

ls --format=single-column 

Dahası, tam dizini kullanıyorsanız, onu hangi dizinde çalıştırdığınıza dikkat etmeniz gerekmez:

ls --format=single-column /root/dir/starting/point/to/target/dir/

Bu son komutu yukarıdakileri kullanıyorum ve aşağıdaki çıktıyı alıyorum:

bot@dev:~/downloaded/Daily# ls --format=single-column /home/bot/downloaded/Daily/*.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141119_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141120_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141121_IENT1.txt.gz
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.