Qual é a maneira mais fácil de remover a linha "total <tamanho>" da saída de ls -l?

14

O melhor que pude encontrar via Google / man lsfoi:

ls -l | grep -v '^total'

Falta alguma coisa nas bandeiras ls?

Além disso, por que o tamanho total está em kb, independentemente do sinalizador -h? arranhar isso, parece que sim, não tenho certeza do que estava vendo naquele momento.

Tom
fonte
4
Talvez um pouco mais eficiente possa ser ls -l | tail -n+2, para o resto eu não tenho uma resposta.
enzotib 13/09/11
Eu gosto mais do método do enzotib. Sugestão: configure-o como um alias e nomeie-o lsl. Apenas 3 letras;) oh e ls -lh me mostram 1,2K de tamanhos.
Rinzwind 13/09/11
Eu acho que você conseguiu o caminho mais fácil.
Robert

Respostas:

11

Olhando no código fonte de coreutils, descobri que totalsempre será exibido ao usar a -lopção em diretórios .

O uso da -dopção para listar entradas em vez do conteúdo do diretório é oculto total. Mas se você executar isso sem argumentos (ou em um diretório), ele mostrará apenas o diretório e não seu conteúdo. Portanto, você precisa de curingas. *corresponde a todos os arquivos e também aos arquivos .*ocultos (o que corresponde à -aopção):

ls -ld * .*

Quanto à -hopção, funciona para mim. 1118360 bytes aparecem como 1,1M. Arquivos menores que 1024 são exibidos em bytes.

Lekensteyn
fonte
1
realmente -d lista diretórios em vez de entradas.
H2ONaCl
@broiyan Você pode levar a lspágina do manual à letra ou considerar o seguinte: ls /pode ser interpretado como "liste a entrada /se for um arquivo ou o conteúdo do diretório /se for um diretório". Usar -dremove a última condição e sempre imprimirá a entrada em vez do conteúdo do diretório. Isso se aplica independentemente de um caminho ser um arquivo ou diretório.
Lekensteyn
Eu upvote isso de novo se eu pudesse
DPS
6

O uso de curingas para evitar a lsexecução da listagem de diretórios é subótimo, pois impede que você use lsopções como --almost-all.

Como a sugestão de Enzotib , a maneira mais simples de removê-lo é canalizá-lo tailpara cortar a primeira linha. No entanto, lsele detectará que sua saída é um canal e não interativo e alterará seus padrões de maneira indesejada. Portanto, para torná-lo robusto, você também deve adicionar algumas opções:

  • --color=always: continue mostrando cores
  • --hide-control-chars: imprime ?nos nomes de arquivos no lugar dos caracteres de controle que podem atrapalhar a saída do console

Eu tenho um script ~/bin/l(você também pode usar um alias do Bash em ~/.bash_aliases):

#!/bin/bash
ls -l --color=always --hide-control-chars "$@" | tail --lines=+2

Você também pode adicionar outras lsopções que desejar por padrão, por exemplo --group-directories-first --time-style='+%FT%T.%N%:::z' --indicator-style=slash.

Caracol mecânico
fonte
No entanto, isso não funcionará se você passar vários nomes de arquivos para ls.
Sparhawk
2

ls -l *

Fornecerá o conteúdo da pasta "normalmente nomeado" sem o total. Isso pode ser adequado às suas necessidades. Infelizmente, ele não fornecerá os dotarquivos prefixados. Se você usar, ls -l * .*você terá uma bagunça, pois o linux navegará na árvore.

Observe que o prefixo de ponto pode significar a pasta ou, com um curinga, significa a pasta acima, para que não ajude a escolher arquivos regulares com prefixo de ponto. Esta parece ter sido uma decisão infeliz de design.

H2ONaCl
fonte
0

$ ls -l [DIRECTORY] | sed 1d
(a saída contém nomes de arquivos)

$ ls -ld [path-to-dir]/*
(a saída contém caminhos relativos, mas preserva as cores)

$ ls -l [DIRECTORY] | tail -n +2

$ ls -l [DIRECTORY] | awk 'NR>=1'


Nota:
O seguinte não funciona se você tiver um arquivo chamado "total ...."

$ ls -l | grep -v '^total'

Robert Vila
fonte