È possibile effettuare ls -l per separare i campi con schede anziché spazi per rendere utile l'output in un foglio di calcolo?


10

Come si può modificare l'output di ls -lseparare i campi utilizzando le schede anziché gli spazi? Voglio incollare l'output in un foglio di calcolo; l'imbottitura con un numero variabile di spazi rende difficile farlo. Illustrare:

drwxr-xr-x 2 root root 4096 26 set 11:43 wpa_supplicant
-rw-r ----- 1 root dialout 66 26 set 11:43 wvdial.conf
drwxr-xr-x 9 radice radice 4096 8 ottobre 08:21 X11
drwxr-xr-x 12 radice radice 4096 18 febbraio 23:31 xdg
drwxr-xr-x 2 radice radice 4096 31 gennaio 06:11 xml
drwxr-xr-x 2 radice radice 4096 22 nov 07:26 xul-ext
-rw-r - r-- 1 root root 349 13 gennaio 2012 zsh_command_not_found

Nell'estratto ls -l /etcmostrato sopra, le righe 1, 2 e 3 hanno una singola cifra nella colonna 2 mentre la riga 4 ne ha due. Ciò significa che l'allineamento si ottiene utilizzando due spazi per separare le colonne 1 e 2 nelle righe 1-3, ma solo uno spazio nella riga 4.

ls 

Risposte:


3

Ho creato uno script di shell per lo stesso. Si occupa dei casi in cui i nomi dei file hanno spazi o altri caratteri speciali.

#! / Bin / bash

SAVEIFS = $ IFS
IFS = $ (echo -en "\ n \ b")
per file in $ (ls)
fare
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ file
    mod_epoch = $ (stat --format = "% Y" $ file)
    mod_month = $ (data -d @ $ mod_epoch + "% b")
    mod_day = $ (data -d @ $ mod_epoch + "% d")
    mod_time = $ (data -d @ $ mod_epoch + "% H:% M")
    printf "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $ file
fatto
IFS = $ SAVEIFS
  • Salvalo in un file, ad esempio ls_tab.sh
  • Renderlo eseguibile:
chmod + x ls_tab.sh
  • Eseguirlo:
./ls_tab.sh

Nota: questo può essere fatto analizzando l'output di ls, tuttavia il motivo per cui non dovrebbe essere fatto è indicato qui .


1
Se l'obiettivo è sapere cosa lsdice , analizzarne l'output va bene. Questo è raramente l'obiettivo. Probabilmente è qui. Penso che il metodo che hai usato sia abbastanza buono (qualsiasi metodo produrrà risultati indesiderati data una serie di esigenze)! Tuttavia, probabilmente l'analisi lspotrebbe essere migliore. Considera il caso di un nome file che contiene effettivamente un carattere di tabulazione. ls -lsostituisce la scheda con un ?carattere. Lo script conserva il carattere di tabulazione, che creerà colonne aggiuntive se il suo output viene interpretato come delimitato da tabulazioni e utilizzato per creare un foglio di calcolo. Si degrada gravemente se un nome di file ha una nuova riga.
Eliah Kagan,

1
Vero. Ma normalmente i file non hanno \no \tnei loro nomi. In tal caso, l'analisi dell'output di lscon semplici comandi bash sarà più complessa, ma può essere raggiunta. Posso aggiornare la risposta, se l'OP vuole gestire tali casi.
verde

Questo funziona per me e i nomi di file lunghi con spazi visualizzati correttamente. Il mio utilizzo è abbastanza semplice e spero di non avere a che fare con file \ne \tnei loro nomi.

1
Perfetto. Per il foglio di calcolo di Windows utilizzare printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $filee per reindirizzare l'output del file come ./ls_tab.sh > listing.txt.
Fedir RYKHTIK il

6

Provare:

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

Oppure, se i nomi dei file hanno spazi:

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. Funziona perfettamente. Questo genere di cose è esattamente ciò che awkserve. Intelligente!
tgies

Purtroppo questo non funziona correttamente per i nomi di file che contengono spazi. Li sostituisce anche con le schede. Mentre questo è più semplice e funziona più velocemente della soluzione basata su script di green7 , questo produrrà un output errato per una grande quantità di tempo e non ha vantaggi rispetto al metodo di Aditya . Questo può essere modificato in modo che gli spazi non vengano più interpretati come delimitatori di input, dopo la nona colonna?
Eliah Kagan,

1
si prega di consultare l'aggiornamento
philshem,

@ psny18 Il modo aggiornato è ancora più gravemente rotto. Si taglia tutto, ma la prima parola di ogni nome di file. La semplice scrittura $9non cambia il fatto che hai awksempre interpretato gli spazi come indicanti un'interruzione tra le colonne. $9cattura solo la prima parola in quella posizione e poiché le altre parole sono considerate colonne separate, con un numero più alto, non vengono mai stampate affatto.
Eliah Kagan,

È un peccato che i nomi dei file non vengano trattati come una colonna anche se contengono spazi.

1

Non è nemmeno necessario convertire l'output come delimitato da tabulazioni. Lo spazio tra le colonne è abbastanza buono.

Esegui il ls -lcomando nel terminale come fai normalmente e copia il contenuto che desideri incollare in un foglio di calcolo.

comando terminale

Quindi, apri il tuo programma di foglio di calcolo (LibreOffice Calc nel mio caso) e premi Ctrl+ Vper incollare il contenuto degli appunti.

Verrà visualizzata la procedura guidata di importazione del testo. Assicurati di mettere un segno di spunta accanto Spacee premi Ok. Puoi vedere l'anteprima nel riquadro inferiore.

Libo Text Import


1
Questo non funzionerà quando i nomi dei file hanno spazi
verde

@ green7: Ah .. Non me ne sono reso conto! :-)
Aditya,

Non solo i nomi dei file ma anche il numero di caratteri nelle colonne. Riempire lì e altrove causa problemi se si sceglie "spazio" come delimitatore. Modificherò la domanda per illustrarlo.

0

python è buono per questo:

# 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 )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.