¿Se puede hacer ls -l para separar campos con pestañas en lugar de espacios para que la salida sea útil en una hoja de cálculo?

10

¿Cómo se ls -lpuede modificar la salida de para separar campos usando pestañas en lugar de espacios? Quiero pegar el resultado en una hoja de cálculo; El relleno con un número variable de espacios hace que sea difícil hacerlo. Para ilustrar:

drwxr-xr-x 2 root root 4096 26 de septiembre 11:43 wpa_supplicant
-rw-r ----- 1 marcación raíz 66 26 de septiembre 11:43 wvdial.conf
drwxr-xr-x 9 root root 4096 8 de octubre 08:21 X11
drwxr-xr-x 12 root root 4096 18 de febrero 23:31 xdg
drwxr-xr-x 2 root root 4096 31 de enero 06:11 xml
drwxr-xr-x 2 root root 4096 22 de noviembre 07:26 xul-ext
-rw-r - r-- 1 raíz raíz 349 13 de enero de 2012 zsh_command_not_found

En el extracto que se ls -l /etcmuestra arriba, las filas 1, 2 y 3 tienen un solo dígito en la columna 2, mientras que la fila 4 tiene dos. Eso significa que la alineación se logra mediante el uso de dos espacios para separar las columnas 1 y 2 en las filas 1-3, pero solo un espacio en la fila 4.


fuente

Respuestas:

3

He hecho un script de shell para lo mismo. Se ocupa de los casos en que los nombres de archivo tienen espacios o cualquier otro carácter especial.

#! / bin / bash

SAVEIFS = $ IFS
IFS = $ (echo -en "\ n \ b")
para archivo en $ (ls)
hacer
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ archivo
    mod_epoch = $ (stat --format = "% Y" $ archivo)
    mod_month = $ (fecha -d @ $ mod_epoch + "% b")
    mod_day = $ (fecha -d @ $ mod_epoch + "% d")
    mod_time = $ (fecha -d @ $ mod_epoch + "% H:% M")
    printf "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $ archivo
hecho
IFS = $ SAVEIFS
  • Guárdelo en un archivo, diga ls_tab.sh
  • Hazlo ejecutable:
chmod + x ls_tab.sh
  • Ejecutarlo:
./ls_tab.sh

Nota: Esto se puede hacer analizando la salida de ls, sin embargo, la razón por la que no se debe hacer se da aquí .

verde
fuente
1
Si el objetivo es saber lo que lsdice , analizar su salida está bien. Ese rara vez es el objetivo. Podría decirse que está aquí. ¡Creo que el método que ha utilizado es bastante bueno (cualquier método producirá resultados no deseados dado un conjunto de necesidades)! Sin embargo, podría decirse que el análisis lspodría ser mejor. Considere el caso de un nombre de archivo que realmente tiene un carácter de tabulación. ls -lreemplaza la pestaña con un ?personaje. Su script conserva el carácter de tabulación, que creará columnas adicionales si su salida se interpreta como delimitada por tabuladores y se utiliza para crear una hoja de cálculo. Se degrada mal si un nombre de archivo tiene una nueva línea.
Eliah Kagan
1
Cierto. Pero normalmente los archivos no tienen \no \ten sus nombres. Si lo hacen, entonces analizar la salida de lscon simples comandos bash será más complejo, pero se puede lograr. Puedo actualizar la respuesta, si el OP quiere manejar tales casos.
verde
Esto funciona para mí y los nombres de archivo largos con espacios en ellos se muestran correctamente. Mi uso es bastante simple y espero no tratar con archivos con \ny \ten sus nombres.
1
Perfecto. Para el uso de hojas de cálculo de Windows printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $filey para redirigir la salida del archivo como ./ls_tab.sh > listing.txt.
Fedir RYKHTIK
6

Tratar:

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

O, si sus nombres de archivo tienen espacios:

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
fuente
+1. Funciona perfectamente. Este tipo de cosas es precisamente para lo que awksirve. ¡Inteligente!
Tgies
Desafortunadamente, esto no funciona correctamente para los nombres de archivo que contienen espacios. Los reemplaza con pestañas también. Si bien esto es más simple y se ejecuta más rápido que la solución basada en script de green7 , esto producirá una salida incorrecta la mayor parte del tiempo y no tiene ventajas sobre el método de Aditya . ¿Se puede modificar esto para que los espacios ya no se interpreten como delimitadores de entrada, después de la novena columna?
Eliah Kagan
1
ver actualización
philshem
@ psny18 La forma actualizada está aún más dañada. Se corta todo pero la primera palabra de cada nombre de archivo. Simplemente escribir $9no cambia el hecho de que awksiempre ha interpretado los espacios como indicando un salto entre columnas. $9captura solo la primera palabra en esa posición, y dado que las otras palabras se consideran columnas separadas y de mayor número, nunca se imprimen en absoluto.
Eliah Kagan
Es una pena que los nombres de archivo no se traten como una columna, incluso si tienen espacios en ellos.
1

Ni siquiera necesitamos convertir la salida como Tab Delimitado. El espacio entre columnas es lo suficientemente fino.

Ejecute su ls -lcomando en la terminal como lo hace normalmente y copie el contenido que desea pegar en una hoja de cálculo.

comando terminal

A continuación, abra su programa de hoja de cálculo (LibreOffice Calc en mi caso) y presione Ctrl+ Vpara pegar el contenido de su portapapeles.

Aparecería el Asistente de importación de texto. Asegúrese de poner una marca de verificación al lado Spacey presione Ok. Puede ver la vista previa en el panel inferior.

Importación de texto de libo

Aditya
fuente
1
Esto no funcionará cuando los nombres de archivo tengan espacios
verde
@ green7: Ah ... ¡No me di cuenta de eso! :-)
Aditya
No solo los nombres de archivo, sino también el número de caracteres en las columnas. El relleno allí y en otros lugares causa problemas si se elige "espacio" como delimitador. Editaré la pregunta para ilustrar eso.
0

Python es bueno para esto:

# 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
fuente