Ls -l pode ser feito para separar campos com tabulações em vez de espaços para tornar a saída útil em uma planilha?

10

Como a saída de pode ls -lser modificada para separar campos usando guias em vez de espaços? Eu quero colar a saída em uma planilha; o preenchimento com um número variável de espaços dificulta isso. Ilustrar:

drwxr-xr-x 2 root root 4096 26 de setembro 11:43 wpa_supplicant
-rw-r ----- 1 discagem raiz 66 set 26 11:43 wvdial.conf
drwxr-xr-x 9 root root 4096 8 de outubro 08:21 X11
drwxr-xr-x 12 root root 4096 18 de fev 23:31 xdg
drwxr-xr-x 2 root root 4096 31 de janeiro 06:11 xml
drwxr-xr-x 2 root root 4096 22 de novembro 07:26 xul-ext
-rw-r - r-- 1 raiz raiz 349 13 de janeiro de 2012 zsh_command_not_found

No trecho ls -l /etcmostrado acima, as linhas 1, 2 e 3 têm um único dígito na coluna 2, enquanto a linha 4 possui dois. Isso significa que o alinhamento é alcançado usando dois espaços para separar as colunas 1 e 2 nas linhas 1-3, mas apenas um espaço na linha 4.


fonte

Respostas:

3

Eu fiz um script de shell para o mesmo. Ele cuida dos casos em que os nomes de arquivos têm espaços ou outros caracteres especiais.

#! / bin / bash

SAVEIFS = $ IFS
IFS = $ (eco -en "\ n \ b")
para arquivo em $ (ls)
Faz
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ arquivo
    mod_epoch = $ (stat --format = "% Y" $ arquivo)
    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" arquivo $ mod_month $ mod_day $ mod_time $
feito
IFS = $ SAVEIFS
  • Salve-o em um arquivo, digamos ls_tab.sh
  • Torne executável:
chmod + x ls_tab.sh
  • Executá-lo:
./ls_tab.sh

Nota: Isso pode ser feito analisando a saída de ls, no entanto, a razão pela qual isso não deve ser feito é fornecida aqui .

verde
fonte
1
Se o objetivo é saber o que lsdiz , analisar bem sua saída. Esse raramente é o objetivo. Indiscutivelmente, é aqui. Eu acho que o método que você usou é muito bom (qualquer método produzirá resultados indesejados, devido a um conjunto de necessidades)! No entanto, a análise sem dúvida lspode ser melhor. Considere o caso de um nome de arquivo que realmente tenha um caractere de tabulação. ls -lsubstitui a guia por um ?caractere. Seu script preserva o caractere de tabulação, que criará colunas extras se sua saída for interpretada como delimitada por tabulação e usada para criar uma planilha. Isso degrada muito se um nome de arquivo tiver uma nova linha.
Eliah Kagan 26/03
1
Verdade. Mas normalmente os arquivos não têm \nou estão \tem seus nomes. Se o fizerem, analisar a saída lscom comandos bash simples será mais complexo, mas pode ser alcançado. Posso atualizar a resposta, se o OP quiser lidar com esses casos.
verde
Isso funciona para mim e nomes de arquivos longos com espaços neles são exibidos corretamente. Meu uso é bastante simples e espero não lidar com arquivos com \ne \tem seus nomes.
1
Perfeito. Para planilha do Windows, use printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $filee para redirecionar a saída do arquivo como ./ls_tab.sh > listing.txt.
Fedir RYKHTIK
6

Experimentar:

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

Ou, se seus nomes de arquivos tiverem espaços:

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
fonte
+1. Funciona perfeitamente. Esse tipo de coisa é exatamente o que awkserve. Esperto!
tgies
Infelizmente, isso não funciona corretamente para nomes de arquivos que contêm espaços. Também os substitui por guias. Embora isso seja mais simples e seja executado mais rapidamente que a solução baseada em script da green7 , isso produzirá uma saída incorreta grande parte do tempo e não terá vantagens sobre o método da Aditya . Isso pode ser modificado para que os espaços não sejam mais interpretados como delímetros de entrada após a 9ª coluna?
Eliah Kagan 26/03
1
consulte atualização
philshem
@ psny18 A maneira atualizada está ainda mais danificada. Ele corta tudo, exceto a primeira palavra de cada nome de arquivo. Simplesmente escrever $9não altera o fato de que você awksempre interpreta espaços como indicando uma quebra entre colunas. $9captura apenas a primeira palavra nessa posição e, como as outras palavras são consideradas colunas separadas e com números mais altos, elas nunca são impressas.
Eliah Kagan 26/03
É uma pena que os nomes de arquivos não sejam tratados como uma coluna, mesmo que tenham espaços neles.
1

Nem precisamos converter a saída como Delimitado por tabulação. O espaço entre as colunas é bom o suficiente.

Execute seu ls -lcomando no terminal normalmente e copie o conteúdo que deseja colar em uma planilha.

comando terminal

Em seguida, abra seu programa de planilha (o LibreOffice Calc no meu caso) e pressione Ctrl+ Vpara colar o conteúdo da sua área de transferência.

O Assistente para importação de texto seria exibido. Coloque uma marca de seleção ao lado Spacee pressione Ok. Você pode assistir a visualização no painel inferior.

Importação de texto Libo

Aditya
fonte
1
Isso não vai funcionar quando nomes de arquivos têm espaços
verde
@ green7: Ah .. Não percebi isso! :-)
Aditya
Não apenas os nomes dos arquivos, mas também o número de caracteres nas colunas. Preencher lá e em outros lugares causa problemas se "espaço" for escolhido como delimitador. Vou editar a pergunta para ilustrar isso.
0

python é bom para isso:

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