Bisakah ls-l dibuat untuk memisahkan bidang dengan tab daripada spasi untuk membuat output berguna dalam spreadsheet?

10

Bagaimana cara output ls -ldimodifikasi ke bidang terpisah menggunakan tab bukan spasi? Saya ingin menempelkan output ke spreadsheet; padding dengan jumlah ruang variabel membuatnya sulit untuk melakukannya. Menggambarkan:

drwxr-xr-x 2 root root 4096 Sep 26 11:43 wpa_supplicant
-rw-r ----- 1 dialout root 66 Sep 26 11:43 wvdial.conf
drwxr-xr-x 9 root root 4096 8 Okt 08:21 X11
drwxr-xr-x 12 root root 4096 18 Februari 23:31 xdg
drwxr-xr-x 2 root root 4096 31 Jan 06:11 xml
drwxr-xr-x 2 root root 4096 22 Nov 07:26 xul-ext
-rw-r - r-- 1 root root 349 Jan 13 2012 zsh_command_not_found

Dalam kutipan dari yang ls -l /etcditunjukkan di atas, baris 1, 2 dan 3 memiliki satu digit di kolom 2 sedangkan baris 4 memiliki dua. Itu berarti perataan dicapai dengan menggunakan dua spasi untuk memisahkan kolom 1 dan 2 di baris 1-3, tetapi hanya satu spasi di baris 4.


sumber

Jawaban:

3

Saya telah membuat skrip shell untuk hal yang sama. Ini menangani kasus ketika nama file memiliki spasi atau karakter khusus lainnya.

#! / bin / bash

SAVEIFS = $ IFS
IFS = $ (echo -en "\ n \ b")
untuk file dalam $ (ls)
melakukan
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ file
    mod_epoch = $ (stat --format = "% Y" $ file)
    mod_month = $ (date -d @ $ mod_epoch + "% b")
    mod_day = $ (date -d @ $ mod_epoch + "% d")
    mod_time = $ (date -d @ $ mod_epoch + "% H:% M")
    printf "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $ file
selesai
IFS = $ SAVEIFS
  • Simpan ke file, katakanlah ls_tab.sh
  • Jadikan itu dapat dieksekusi:
chmod + x ls_tab.sh
  • Menjalankannya:
./ls_tab.sh

Catatan: Ini dapat dilakukan dengan mem-parsing output ls, namun alasan mengapa tidak dilakukan diberikan di sini .

hijau
sumber
1
Jika tujuannya adalah untuk mengetahui apa yang lsdikatakan , parsing outputnya baik-baik saja. Itu jarang tujuannya. Bisa dibilang itu ada di sini. Saya pikir metode yang Anda gunakan cukup baik (metode apa pun akan menghasilkan hasil yang tidak diinginkan dengan sejumlah kebutuhan)! Namun, bisa dibilang parsing lsmungkin lebih baik. Pertimbangkan kasus nama file yang sebenarnya memiliki karakter tab di dalamnya. ls -lmengganti tab dengan ?karakter. Script Anda mempertahankan karakter tab, yang akan membuat kolom tambahan jika hasilnya diartikan sebagai tab-delimeted dan digunakan untuk membuat spreadsheet. Ini rusak parah jika nama file memiliki baris baru.
Eliah Kagan
1
Benar. Tetapi biasanya file tidak memiliki \natau \tatas nama mereka. Jika mereka melakukannya, maka parsing output lsdengan perintah bash sederhana akan lebih kompleks, tetapi dapat dicapai. Saya dapat memperbarui jawabannya, jika OP ingin menangani kasus seperti itu.
hijau
Ini berfungsi untuk saya dan nama file yang panjang dengan spasi di dalamnya ditampilkan dengan benar. Penggunaan saya cukup sederhana dan saya harap tidak berurusan dengan file dengan \ndan \tatas nama mereka.
1
Sempurna. Untuk Windows menggunakan speadsheet printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $filedan untuk mengarahkan file ouptut sebagai ./ls_tab.sh > listing.txt.
Fedir RYKHTIK
6

Mencoba:

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

Atau, jika nama file Anda memiliki spasi:

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;}'
philshem
sumber
+1. Bekerja dengan sempurna. Hal-hal seperti inilah tepatnya untuk apa awk. Pintar!
tgies
Sayangnya ini tidak berfungsi dengan benar untuk nama file yang mengandung spasi. Itu menggantikan mereka dengan tab juga. Meskipun ini lebih sederhana dan berjalan lebih cepat daripada solusi berbasis skrip green7 , ini akan menghasilkan output yang salah dalam waktu yang lama, dan tidak memiliki kelebihan dibandingkan metode Aditya . Bisakah ini diubah sehingga spasi tidak lagi ditafsirkan sebagai delimeter input, setelah kolom ke-9?
Eliah Kagan
1
silakan lihat pembaruan
philshem
@ psny18 Cara yang diperbarui lebih parah lagi. Itu memotong segalanya kecuali kata pertama dari setiap nama file. Cukup menulis $9tidak mengubah fakta bahwa Anda awkselalu menafsirkan spasi sebagai indikasi jeda antar kolom. $9hanya menangkap kata pertama dalam posisi itu, dan karena kata-kata lain dianggap terpisah, kolom-kolom bernomor lebih tinggi, mereka tidak pernah dicetak sama sekali.
Eliah Kagan
Sangat disayangkan bahwa nama file tidak diperlakukan sebagai satu kolom bahkan jika mereka memiliki spasi di dalamnya.
1

Kami bahkan tidak perlu mengonversi output sebagai Tab Delimited. Ruang antar kolom cukup baik.

Menjalankan ls -lperintah di terminal seperti yang Anda biasanya lakukan dan menyalin isi yang ingin disisipkan dalam Spreadsheet a.

perintah terminal

Selanjutnya, buka program Spreadsheet Anda (LibreOffice Calc dalam kasus saya) dan tekan Ctrl+ Vuntuk menempelkan konten clipboard Anda.

Panduan Impor Teks akan muncul. Pastikan Anda meletakkan tanda centang di sebelah Spacedan tekan Ok. Anda dapat menonton pratinjau di panel bawah.

Impor Teks Libo

Aditya
sumber
1
Ini tidak akan berfungsi ketika nama file memiliki spasi
hijau
@ green7: Ah .. Tidak menyadarinya! :-)
Aditya
Bukan hanya nama file tetapi juga jumlah karakter di kolom. Padding di sana dan di tempat lain menyebabkan masalah jika "ruang" dipilih sebagai pembatas. Saya akan mengedit pertanyaan untuk menggambarkan itu.
0

python bagus untuk ini:

# 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 )
JWest
sumber