Formatando ls -l Saída para o arquivo delimitado por pipe

0

Eu sou relativamente novo no Unix e poderia usar alguma ajuda. Quando executo o comando ls -l (na verdade ls -alR ) e canalizo a saída para um arquivo, há espaços usados na separação dos campos ls retornados. O que eu estou procurando alcançar é essencialmente separar os campos ls, digamos, um Tab ou um caractere de pipe (ou deveria funcionar). Comecei a olhar para o comando pr e substituí os espaços por Tabs, mas isso não funcionou, pois há um número variável de espaços na saída ls, o que resultou em campos errôneos ao importar esse arquivo.

    
por Jason 07.11.2017 / 17:10

3 respostas

3

Se você for analisar essa saída mais tarde, eu a desencorajaria. Veja esta página para uma boa descrição do motivo. Em qualquer caso, será muito difícil obter as informações desejadas usando ls , especialmente se houver espaços ou outros caracteres especiais em nomes de arquivos. Uma opção melhor se você quiser apenas criar um csv ou algo assim é usar a opção -printf para find. Esse comando deve começar:

find . -printf "%M|%n|%u|%s|%P\n" > output

Observe que isso irá reciclar a partir do diretório inicial, como o comando ls . Ele despeja as permissões, contagem de links, proprietário, grupo, tamanho e nome de arquivo em um arquivo com campos separados por pipes. Confira a man page de find para mais informações.

    
por 07.11.2017 / 17:47
3

Em vez de pular aros para analisar ls, você poderia emular ls -l com o comando GNU coreutils stat , usando um formato de sua escolha. Se você colocar em camadas um shell bash para a opção globstar para listar recursivamente os arquivos e a opção dotglob para listar os arquivos de pontos, você poderá obter resultados bem razoáveis. Para os tempos de modificação do arquivo, escolhi usar %Y , que é "segundos desde a época"; você pode usar %y ou até mesmo passar o valor% Y para date para reformatá-lo como quiser. Usar segundos-desde-o-epoch é uma maneira bastante flexível de permitir que o processador down-stream o exiba da maneira que desejar.

Para um arquivo simples:

$ stat -c "%A|%h|%U|%G|%s|%Y|%n" hosts.txt
-rw-r--r--|1|username|pgrp|135387|1202230643|hosts.txt

Para emular ls -alR :

$ shopt -s globstar dotglob
$ stat -c "%A|%h|%U|%G|%s|%Y|%n" **
drwxr-xr-x|2|username|pgrp|4096|1510073497|.dotdir
-rw-r--r--|1|username|pgrp|0|1510073497|.dotdir/.dotfile
-rw-r--r--|1|username|pgrp|0|1507213776|f/test case
-rw-r--r--|1|username|pgrp|0|1507213776|f/test case.csv
-rw-r--r--|1|username|pgrp|135387|1202230643|hosts.txt
drwxr-xr-x|2|username|pgrp|4096|1510073307|space dir
-rw-r--r--|1|username|pgrp|0|1510073307|space dir/space file
-rwxr-xr-x|1|username|pgrp|112|1510073163|stat.sh

Embora isso possa ser menos portátil (para sistemas que não possuem coreutils / stat), ele tem a vantagem de ser flexível, imprimindo apenas os campos que lhe interessam e não corre o risco de substituir espaços em nomes de arquivos.

    
por 07.11.2017 / 17:56
0

adicione simplesmente o seguinte:

ls -alR |  sed -r s'/\s+/|/g'

isso deve funcionar para qualquer comando cuja saída você gostaria de modificar. \ s significa "espaço" o "+" significa uma ou mais ocorrências (então, ele corresponderia à tabulação ", então o" | "é o símbolo que usaríamos para o novo separador. Por favor, tenha em mente que existem alguns caracteres especiais que devem ser escapados com "\". se você gosta de abas, aqui está:

 ls -alR |  sed -r s'/\s+/\t/g'
    
por 07.11.2017 / 17:23