Como mostrar apenas as últimas colunas k em ls -l?

5

Eu gosto de restringir as colunas mostradas no comando ls -l , eliminando as primeiras 4 colunas.

ls -lh mostra:

drwxr-sr-x 20 gamma alpha 4.0K May 22 13:18 Desktop
drwxr-sr-x  3 gamma alpha   22 Oct  6  2014 Eclipse
-rw-r--r--  1 gamma alpha  28K Jul 11  2014 fire
drwxr-sr-x  5 gamma alpha   48 Mar 31  2014 lb_deployment

Para eliminar as quatro primeiras colunas, tentei ls -lh | cut -d " " -f5- . Mas não se comporta como desejado:

4.0K May 22 13:18 Desktop
alpha  22 Oct  6  2014 Eclipse
alpha 28K Jul 11  2014 fire
alpha  48 Mar 31  2014 lb_deployment

Eu gosto disso:

4.0K May 22 13:18 Desktop
  22 Oct  6  2014 Eclipse
 28K Jul 11  2014 fire
  48 Mar 31  2014 lb_deployment

O motivo pelo qual ele não se comporta como desejado é que, em cut defini delimitador como espaço em branco ( -d " " ), mas como o número de links (segunda coluna de \ls -lh ) do primeiro arquivo é um número de 2 dígitos (20), ls -lh adiciona outro espaço em branco ao contador de links dos arquivos com contador de links de 1 dígito para ajustar as posições das colunas. E isso faz com que cut não se comporte como desejado.

Alguma idéia de como corrigir isso?

    
por LoMaPh 23.05.2015 / 01:53

4 respostas

6

Passe as opções -o e -g para omitir as colunas de usuário e de grupo. Como os nomes de usuários e grupos podem conter espaços, não é possível editá-los de maneira confiável.

Não há opção de omitir as permissões e as colunas de contagem de links. Como a primeira coluna que você deseja manter pode começar com espaço em branco (para alinhamento à direita), não é possível usar a transição de espaço em branco para não espaço em branco como o critério de início. Em vez disso, use a borda direita da última coluna para eliminar as colunas que você não deseja. Isso é seguro porque as duas primeiras colunas não podem conter espaços em branco incorporados.

ls -lhog | sed 's/^[^ ][^ ]*  *[^ ][^ ]* //'

Explicação do comando sed:

  • s/REGEXP/REPLACEMENT/ substitui a primeira ocorrência da expressão regular especificada em cada linha pelo texto de substituição especificado. Aqui o texto de substituição está vazio.
  • ^ no início da regexp faz com que ela corresponda apenas no início da linha.
  • [^ ][^ ]* corresponde a qualquer sequência não vazia de caracteres que não seja um espaço.
  • Assim, o comando sed remove as primeira e segunda seqüências que não são espaços em branco, assim como o próximo espaço (mas apenas um espaço no final).
por 23.05.2015 / 02:17
2

Isso funciona para mim:

ls -lhn | sed -r 's#^\S+(\s+\S+){3}##'

O sinalizador -n extra para ls transforma nomes de usuários e grupos em IDs numéricos. Como resultado, obtemos um número conhecido de campos para remover:

-rwxr-xr-x  1 1001 1001 1.4K Mar 23 18:07 something.sh

O espaço em branco entre cada uma das colunas é variável, mas é o que o ls usa para alinhar as colunas, portanto, não podemos simplesmente retirá-las às cegas. Eu escolhi desmembrar o bloco principal de permissões, seguido por três grupos de whitespace-text e não-whitespace-text , correspondendo ao link count, uid e gid respectivamente. Isso deixa o espaço em branco separando o gid do tamanho do arquivo intocado para que o alinhamento possa continuar a funcionar. A expressão regular sed é o que implementa essa remoção de padrão. #...#...# fornece os delimitadores ( correspondência e substituição ), e o sinalizador -r nos permite usar expressões regulares estendidas. Dissecando que temos ^ correspondência de início de linha; o \S+ corresponde a um ou mais caracteres que não são espaços em branco e \s+ corresponde a um ou mais caracteres em branco; os parênteses (...) agrupam esses dois itens e as chaves {3} informam que o grupo deve ser repetido três vezes.

 4.0K Jun  6  2014 template
 4.0K May 21 17:35 stuff
    0 Mar 16 09:46 Items
 1.4K Mar 23 18:07 something.sh
  24K May 19 14:45 curtain
    
por 23.05.2015 / 02:13
0

Juntando-se ao coro, você também pode usar awk para apagar as colunas que não deseja:

[jis@localhost ~]$ ls -lh | awk '{$1=$2=$3=$4="";print}'

    4.0K Aug 19 2014 Desktop
    4.0K Jan 8 22:39 dir1
    4.0K Feb 5 20:41 Documents
    12K May 22 19:31 Downloads
    4.0K Aug 19 2014 Music
    4.0K May 3 20:00 Pictures
    4.0K Aug 19 2014 Public
    115K May 9 09:05 something.bin
    4.0K Aug 19 2014 Templates
    1 Dec 12 07:01 testLink -> .
    4.0K Aug 19 2014 Videos
[jis@localhost ~]$ 
    
por 23.05.2015 / 02:19
0

Uma solução interessante usando o grep:

ls -lhn | grep -oP "^([[:graph:]]+\s){4}\K.+"

Aqui,

[[:graph:]] ==> all printed characters (i.e. no spaces, newlines)
\s          ==> space
{4}         ==> exactly four matches
    
por 23.05.2015 / 02:02

Tags