Ls -l, çıktıyı bir e-tabloda yararlı kılmak için alanları boşluk yerine sekmelerle ayırmak için kullanılabilir mi?


10

Çıktılar ls -lboşluk yerine sekmeler kullanılarak ayrı alanlara nasıl değiştirilebilir? Çıktı bir elektronik tabloya yapıştırmak istiyorum; değişken sayıda boşluğa sahip dolgu, bunu zorlaştırır. Örneklemek gerekirse:

drwxr-xr-x 2 kök kökü 4096 Eyl 26 11:43 wpa_supplicant
-rw-r ----- 1 kök diyaloğu 66 Eyl 26 11:43 wvdial.conf
drwxr-xr-x 9 kök kökü 4096 8 Ekim 08:21 X11
drwxr-xr-x 12 kök kök 4096 Şub 18 23:31 xdg
drwxr-xr-x 2 kök kök 4096 Ocak 31 06:11 xml
drwxr-xr-x 2 kök kök 4096 Kasım 22 07:26 xul-ext
-rw-r - r-- 1 kök kökü 349 13 Oca 2012 zsh_command_not_found

ls -l /etcYukarıda gösterilen alıntıda , satır 1, 2 ve 3 sütun 2'de tek bir basamağa sahipken sıra 4'te iki vardır. Bu, hizalamanın 1-3 satırlarında sütun 1 ve 2'yi ayırmak için iki boşluk, ancak sıra 4'te sadece bir boşluk kullanılarak sağlandığı anlamına gelir.

ls 

Yanıtlar:


3

Ben de bir kabuk betiği yaptım. Dosya adlarının boşlukları veya başka özel karakterleri olduğunda durumlara dikkat eder.

#! / Bin / bash

SAVEIFS = $ IFS
IFS = $ (echo -en "\ n \ b")
$ (ls) cinsinden dosya için
yapmak
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ dosya
    mod_epoch = $ (stat --format = "% Y" $ dosya)
    mod_month = $ (tarih -d @ $ mod_epoch + "% b")
    mod_day = $ (tarih -d @ $ mod_epoch + "% d")
    mod_time = $ (tarih -d @ $ mod_epoch + "% H:% M")
    printf "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $ dosya
tamam
IFS = $ SAVEIFS
  • Diyelim ki bir dosyaya kaydedin ls_tab.sh
  • Yürütülebilir yap:
chmod + x ls_tab.sh
  • Çalıştır:
./ls_tab.sh

Not: Bu, çıktısını ayrıştırarak yapılabilir ls, ancak yapılmaması gereken neden burada verilmiştir .


1
Amaç bilmek ise neyi lssöylüyor , çıkışını ayrıştırma gayet iyi. Amaç nadiren budur. Muhtemelen burada. Kullandığınız yöntemin oldukça iyi olduğunu düşünüyorum (herhangi bir yöntem bazı ihtiyaçlar seti nedeniyle istenmeyen sonuçlar üretecektir )! Ancak tartışmalı olarak ayrıştırma lsdaha iyi olabilir. İçinde sekme karakteri bulunan bir dosya adı örneğini düşünün. ls -lsekmeyi bir ?karakterle değiştirir. Komut dosyanız, çıktısı sekmeyle ayrılmış ve bir e-tablo oluşturmak için kullanılıyorsa fazladan sütunlar oluşturacak sekme karakterini korur. Bir dosya adının yeni bir satırı varsa, kötü bir şekilde parçalanır.
Eliah Kagan

1
Doğru. Ancak normalde dosyaların adı yoktur \nveya \tisimleri yoktur. Eğer yaparlarsa, çıktılarını lsbasit bash komutlarıyla ayrıştırmak daha karmaşık olacaktır, ancak elde edilebilir. OP bu tür durumları ele almak istiyorsa cevabı güncelleyebilirim.
yeşil

Bu benim için çalışıyor ve içinde boşluk olan uzun dosya adları düzgün görüntüleniyor. Kullanımım oldukça basit ve umarım dosyalarında \nve \tisimlerinde dosyalarla uğraşmamayı umuyorum .

1
Mükemmel. Windows elektronik tablo için printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $fileve çıkışını dosya olarak yeniden yönlendirmek için ve kullanın ./ls_tab.sh > listing.txt.
Fedir RYKHTIK

6

Deneyin:

ls -l | awk -v OFS="\t" '$1=$1'

Veya dosya adlarınızda boşluk varsa:

ls -l | awk '{print $1,"\t",$2,"\t",$3,"\t",$4,"\t",$5,"\t",$6,"\t",$7,"\t",$8,"\t",$9,$10,$11,$12,$13,$14,$15;}'

+1. Mükemmel çalışıyor. Bu tür bir şey tam olarak ne awkiçindir. Zeki!
tgies

Ne yazık ki bu, boşluk içeren dosya adları için düzgün çalışmıyor. Bunları sekmelerle de değiştirir. Bu daha basit ve green7'nin komut dosyası tabanlı çözümünden daha hızlı çalışmasına rağmen , bu büyük miktarda yanlış çıktı üretir ve Aditya'ın yöntemine göre hiçbir avantajı yoktur . 9. sütundan sonra, boşluklar artık girdi sınırlayıcılar olarak yorumlanmayacak şekilde değiştirilebilir mi?
Eliah Kagan

1
lütfen güncellemeye bakın
philshem

@ psny18 Güncellenmiş yol daha da bozuk. Bu her şeyi ama her dosya adının ilk kelime keser. Basitçe yazmak $9, awkboşlukları her zaman sütunlar arasında bir kırılma olduğunu yorumladığınız gerçeğini değiştirmez . $9yalnızca bu konumdaki ilk sözcüğü yakalar ve diğer sözcükler ayrı, daha yüksek numaralı sütunlar olarak kabul edildiğinden, bunlar hiçbir zaman yazdırılmaz.
Eliah Kagan

Bu, dosya adlarında boşluk olsa bile bir sütun olarak görülmemesi üzücü.

1

Çıktıyı Sekmeyle Sınırlandırılmış olarak dönüştürmemize bile gerek yok. Sütunlar arasındaki boşluk yeterince iyi.

ls -lNormalde yaptığınız gibi komutunuzu terminalde çalıştırın ve bir E-tabloya yapıştırmak istediğiniz içeriği kopyalayın.

terminal komutu

Ardından, Elektronik Tablo programınızı açın (benim durumumda LibreOffice Calc) ve panonuzun içeriğini yapıştırmak için Ctrl+ tuşuna basın V.

Metin Alma Sihirbazı açılır. Yanına bir onay işareti koyduğunuzdan emin olun Spaceve düğmesine basın Ok. Önizlemeyi alt bölmede izleyebilirsiniz.

Libo Metin İçe Aktarma


1
Dosya adlarında boşluk olduğunda bu çalışmaz
yeşil

@ green7: Ah .. Farkında değildim! :-)
Aditya

Yalnızca dosya adları değil, aynı zamanda sütunlardaki karakter sayısı. Sınırlayıcı olarak "boşluk" seçilirse, orada ve başka yerlerde dolgu yapmak sorun yaratır. Bunu göstermek için soruyu düzenleyeceğim.

0

python bunun için iyidir:

# python
import os

os.system( 'ls -lR --time-style=full-iso /home/jw > ls_dump.txt')

folder = ''

for line in open('ls_dump.txt', 'r'):

    inrec = line.split()

    if inrec == []:
        continue

    if inrec[0].startswith('total'):
        continue

    if inrec[0].endswith(':'):
        folder = inrec[0].replace(':','')
        continue

    outline = folder + '\t' + '\t'.join(inrec[0:8]) +'\t'+ ' '.join(inrec[8:]) 

    print( outline )
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.