Cabeças unix antigas (aquelas da era anterior à GUI) costumavam capitalizar seus nomes de pastas e tornar os nomes de arquivo simples sem capitalização para obter esse resultado automaticamente.
JRobert
Pergunta útil! Talvez seja hora de mudar a resposta aceita para uma que seja mais simples e que não quebre as cores dos terminais?
IPPI
Tentels -lh --group-directories-first
Diogo
Respostas:
28
O comando a seguir listará os diretórios primeiro, os arquivos comuns em segundo e os links em terceiro.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Além disso, faria muito sentido criar um alias para esse comando para salvar as teclas digitadas.
Editar:
Se você deseja primeiro os diretórios e depois tudo o que não é um diretório, use o seguinte:
Este comando não listar tudo, se houver, por exemplo, sockets ou FIFO na pasta
Studer
1
Essa versão editada ainda deve funcionar com outros tipos. O primeiro grep diz tudo que começa com um 'd' e o segundo diz tudo que não começa com um 'd'. Certamente tudo começa com o anúncio ou não, certo?
Ry4an Brase
1
@ Mark - Por que não basta fazer ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total":?
FCTW 19/08/13
1
Para fazer @ comando do FCTW um alias OSX, adicione isso ao seu ~ / .profile:alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
aliteralmind
2
Encontrei uma notação mais curta: ls -la|grep ^d;ls -la|grep -v ^d(aspas não são necessárias e substituídas &&por ;). Outra opção é a introdução de uma variável e, em seguida, avaliá-lo: a="ls -la|grep ^d";eval $a;eval $a -v. Pode ser útil para evitar repetições quando muito mais opções são especificadas para ls/ grep. Há também essa ls -la --group-directories-firstopção, no entanto, a menor imo éls -la|sort
Steven Pribilinskiy 23/03
205
Eu amo tanto * nix e adoro ver a criatividade que entra em algumas dessas respostas ...
A minha não é tão chique no GNU Linux:
alias ls='ls --color -h --group-directories-first'
Dado que estou mais à vontade com meus aplicativos CLI Linux, também costumo atualizar o coreutils no OSX:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
infelizmente, isso não funciona no terminal osx, pois a opção - não está disponível.
MEM
7
re love: Isso é sarcasmo? Se assim for, eu concordo.
precisa saber é o seguinte
4
O objetivo do alias ls é definir os elementos de configuração que quero usar 90% do tempo. Menos pressionamentos de teclas para obter a saída desejada. Se você quiser ter saída ls nativa, poderá sempre / bin / ls.
Jonathanserafini
4
@MEM Se você estiver usando o OS X e gosta de usar o Terminal, brew install bash então deve funcionar! :)
Andrew Ashbacher
5
Minha opinião: esta deve ter sido a resposta aceita como ele lista uma opção de linha de comando para realizar exatamente o objetivo, em vez de um conjunto complicado de etc. do grep
Sim, por padrão. Você também pode usar coreutils por padrão com PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH".
benesch
7
Há certas coisas que quero ver em uma lista de diretórios e, até o momento, nenhuma das respostas aqui atende a todos os requisitos abaixo. Meus requisitos para uma listagem de diretório:
Diretórios e arquivos são classificados em ordem alfabética
Os diretórios são listados primeiro
Links simbólicos (links simbólicos) são classificados como arquivos
A classificação não diferencia maiúsculas de minúsculas
A classificação ignora todos os caracteres não-alfa iniciais em um nome de arquivo
A listagem inclui a contagem total de diretórios (excluindo ./e ../), arquivos e links
A listagem inclui o tamanho total (uso do disco) de diretórios e arquivos
A listagem deve ter a mesma aparência no Linux e no Windows (shell Git Bash) - essa foi a mais difícil de corrigir, pois opções convenientes como --group-directories-firstnão funcionam no Git Bash para Windows
Depois de muitos hackers, finalmente criei uma linha (embora muito longa ;-)) com a qual estou satisfeito. Eu atribuí isso a um alias chamado 'dir':
ls -dlF --color *.*| head -n2 && ls -AlF| LC_ALL=C grep "^d"|
LC_ALL=C sort -k 9df&& ls -AlF| LC_ALL=C grep "^[l-]"|
LC_ALL=C sort -k 9df&& echo -e `find -maxdepth 1 -type d ! -name . |
wc -l`Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f |
wc -l`File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- |
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l`Link\(s\)
Para facilitar o gerenciamento, criei comandos separados para exibir cada segmento da lista de diretórios da minha preferência e os reuni usando o &&operador.
ls -dlF --color * .* | head -n2- Extraia ./e ../. Não queremos repassá-los sortporque eles já estão na ordem correta e a classificação deles pode resultar na ../listagem primeiro. A -dopção é se livrar da linha "total"; Eu gosto de adicionar -Fpara mostrar a barra final dos diretórios (ele também marcará links simbólicos com "@" quando você fizer um simples ls -F).
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df- Extraia os diretórios e os ordene por nome de arquivo (coluna 9), ignorando os caracteres não-alfa / espaço ( dopção) e os caracteres ( fopção). A ls -Aopção exclui ./e ../da listagem, pois já as extraímos na etapa anterior. Eu costumo prefixar todos os comandos grepe sortcom a LC_ALL=Credefinição local para que (1) a saída seja consistente entre os shells do Unix e (2) às vezes você possa ver um desempenho mais rápido, já que não possui mais a sobrecarga do pesado caractere UTF-8 definido como Lide com.
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df - Isso é semelhante ao passo acima, mas desta vez estamos classificando arquivos e links simbólicos.
find -maxdepth 1 -type d ! -name . | wc -l- Obtenha o número de diretórios, excluindo ./e ../.
find -maxdepth 1 -type f | wc -l - Obtenha o número de arquivos.
find -maxdepth 1 -type l | wc -l - Obtenha o número de links simbólicos.
du -hs | cut -f 1 - Extraia o tamanho total de todos os subdiretórios no formato legível por humanos.
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1 - Extraia o tamanho total de todos os arquivos em formato legível por humanos.
Uma desvantagem menor é que você não pode ter listas coloridas, pois os caracteres de controle de cores que cercam os nomes dos arquivos tornam a classificação muito pouco confiável.
ATUALIZAR
O alias acima era dolorosamente lento quando executado a partir do diretório raiz de um sistema de arquivos profundo, por isso atualizei para este comando mais simples, mas com muito mais desempenho:
ls -AFoqv--color --group-directories-first | tail -n +2&& find -maxdepth 1-type f -printf '%s\n'| awk '{total+=$1} END {print total" bytes"}'
Como a nova versão do Git Bash para Windows suporta --group-directories-first, não precisamos mais voltar a usá-lo sort. Mesmo que o novo alias não exiba tanta informação quanto o alias anterior, os ganhos de desempenho valem a pena. Como vantagem, você também recebe cores!
Ótima resposta! Mas quando você diz: “Depois de muita invasão, finalmente criei uma linha…” Sim, na verdade, essa não é realmente uma “linha única” no sentido clássico. Pode fazer sentido usar essa lógica e torná-la um script de shell independente e apenas executá-la ou chamá-la como um alias.
JakeGould
@JakeGould Você é rápido! Ainda nem terminei de ler a minha resposta e você já terminou de ler e disparou um comentário :). Sim, é o candidato principal para uma função, mas eu era muito preguiçoso na época, então joguei no meu arquivo .bash_aliases. Por outro lado, eu normalmente escrevo apenas uma função quando não posso fazer algo sem passar parâmetros.
Thdan
@ 10basetom: Pergunta rápida: Como você obtém as cores diferentes para as colunas em ls? Posso colorir nomes de arquivos por tipo de arquivo usando ls --color, mas não vejo uma maneira de obter essas cores úteis para as colunas. Qual o segredo?
Pirx
@Pirx Eu acredito que as colunas são coloridas pela sintaxe padrão do Stack Exchange, destacando :-).
Thdan #
Sim, isso parece ser o caso, mas é uma ótima idéia, e as soluções estão em ;-)
Pirx
6
Você tem várias opções, dependendo se deseja manter a ordem alfabética.
Você pode simplesmente tentar:
ls -al | ordenar -k1 -r
ou isso, para manter a ordem alfabética dos arquivos com as mesmas permissões:
ls -al | classificação -k1,1 -k9,9 -r
ou, como onze81 disse (mas esta versão lista tudo):
Esta é uma solução IMO mais agradável. Usar vários processos e tubulações para classificar em vez de tubulação para classificar parece meio atrasado. Especialmente porque ls- al|sort -k1 -rfunciona. O que estava faltando é apenas a -rbandeira.
Brice
@brice O que mais me incomoda com 'classificação' é isso ./e ../não serão as duas primeiras linhas, nessa ordem. Fora isso, concordo que é a solução mais eficiente.
thdoan
Como colorir a saída?
Danijel
5
Para a resposta de delerious010 , gostaria de acrescentar que, se você quiser pedidos com estilo antigo:
LANG=C ls -la --group-directories-first
(ou use LC_ALL ou LANGUAGE ou LC_COLLATE definido como "C").
Isso dará algo semelhante a:
...
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file
Embora, se bem me lembro, os arquivos de ponto oculto originalmente aparecessem antes dos diretórios.
Aqui está uma função para fazer isso (bash ou zsh): E ... eu não estou sugerindo que esta é a melhor maneira, mas é a que eu criei e estou usando agora:
função lss
{
# Mostra a listagem de diretórios com os diretórios na parte superior.
comando ls --color = sempre $ @ | egrep '^ d | total'
comando ls --color = sempre $ @ | egrep -v '^ d | total';
}
Apenas um ano, isso não parece funcionar. Você precisa usar o formato de listagem longa ( ls -l) para filtrar por tipo de arquivo assim. Além disso, este comando será interrompido nos espaços (no bash). Você precisa citar da seguinte maneira: "$@"Se você quiser usar essa abordagem, poderá fazer algo assim:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
Six
2
ls -laX mostrará os diretórios primeiro em ordem alfabética, mas estragará a lista de arquivos.
Opções longas:
ls
-l # List--all
-X # Sort alphabetically by entry extension
O que eles fazem? Onde você aprendeu a digitá-los?
Tamara Wijsman
Bem, meu sistema operacional preferido é o Debian Linux. A versão do pacote Debian gnu core utils do ls suporta a opção --show-directory-first ... quando comecei a usar o OSX, simplesmente peguei todos os meus arquivos bash dot da minha caixa Debian e os soltei no meu diretório home ... tinha um monte de bash_aliases que quebrou assim ... foi então que eu tinha que descobrir algumas soluções alternativas para os meus aliases ...
Eddie B
O primeiro é um pouco redundante ... Não há realmente nenhuma razão para classificar os diretórios, pois é a ordem que precisamos modificar, não os diretórios ... o 'ls -la | sort -r 'é o que realmente funciona. Basicamente, está declarando ... 1) A) Encontre. -d 1 -type d (Comece neste diretório, pesquise uma profundidade de diretório e pesquise apenas diretórios) B) ls -la (liste todos os atributos de arquivos) C) Classifique-os ao contrário 2) Faça como 1) apenas solte a localização. .. não é necessário ... Eu realmente gosto solução Studers' melhor ... :-)
Eddie B
1
TL; DR
alias ls='ls -lhF --color'
list_sorted(){
ls $*| grep "^d";
ls $*| grep "^-";
ls $*| grep -v -E "^d|^-|^total"}
alias ll=list_sorted
Explicação
Eu uso uma combinação das soluções fornecidas nas respostas e comentários aqui.
Padrão ls
Antes de tudo, substituo o comportamento padrão para ls:
-l: Sempre exiba a lista como uma lista vertical unidimensional
-h: Exibe tamanhos de arquivo legíveis por humanos (por exemplo, 4.0K em vez de 4096)
-F: Exibir indicadores como uma barra final para diretórios
alias ls='ls -lhF --color'
Estendido ll
Em seguida, escrevo uma função que contém a lógica de classificação. Para cada um deles ls, passo quaisquer argumentos passados originalmente para ele. Isso me permite usar o alias de um diretório de trabalho diferente daquele que eu quero listar (ou seja ls -a ~).
Além disso, cada chamada para lsé canalizada para um grepcomando. Aqui, a classificação acontece. ls -l | grep "^d"por exemplo, lista apenas diretórios. Se os diretórios devem ser listados primeiro, isso também deve vir em primeiro lugar na função. A próxima coisa são os arquivos.
Por fim, mostro tudo o que não é um diretório nem um arquivo (nem a linha que mostra o tamanho total do conteúdo do diretório). Isso é feito grepping diretamente, entradas regulares de arquivos e a entrada total e, em seguida, invertendo o resultado por meio do -vargumento
list_sorted(){# List directories
ls $*| grep "^d";# List regular files
ls $*| grep "^-";# List everything else (e.g. symbolic links)
ls $*| grep -v -E "^d|^-|^total"}
Finalmente, alias a função para um novo comando. Em particular, não quero sobrescrever lscaso minha função seja interrompida em alguns cenários. Então eu quero poder usar ls. Como alternativa, você sempre pode chamar o lscomando sem serrilhado chamando \ls.
alias ll=list_sorted
Notas
Eu uso em ;vez de &&como um delimitador para os comandos. Caso contrário, não será possível listar o conteúdo de diretórios que não contêm diretórios (o primeiro comando ls é avaliado como falso, não permitindo a execução do próximo comando, pois ele é acoplado a &&. ;Evita isso.)
Esta é uma solução de script. Lista apenas os nomes, sem dados do inode, alfabéticos, sem distinção entre maiúsculas e minúsculas, formatados em colunas. Embora seja maior de linha em vez de maior de coluna, como a saída padrão de ls. As colunas ficam um pouco confusas se houver um nome de arquivo com> 26 caracteres.
rm -f /tmp/lsout
ls -1p| grep /| sort -f >>/tmp/lsout
ls -1p| grep -v /| sort -f >>/tmp/lsout
IFS=$'\n' read -d ''-r -a lines </tmp/lsout
printf "%-24s %-24s %-24s\n""${lines[@]}"
-
vem antesd
ao usarsort
ls -lh --group-directories-first
Respostas:
O comando a seguir listará os diretórios primeiro, os arquivos comuns em segundo e os links em terceiro.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Além disso, faria muito sentido criar um alias para esse comando para salvar as teclas digitadas.
Editar:
Se você deseja primeiro os diretórios e depois tudo o que não é um diretório, use o seguinte:
ls -la | grep "^d" && ls -la | grep -v "^d"
fonte
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"
:?alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
ls -la|grep ^d;ls -la|grep -v ^d
(aspas não são necessárias e substituídas&&
por;
). Outra opção é a introdução de uma variável e, em seguida, avaliá-lo:a="ls -la|grep ^d";eval $a;eval $a -v
. Pode ser útil para evitar repetições quando muito mais opções são especificadas parals
/grep
. Há também essals -la --group-directories-first
opção, no entanto, a menor imo éls -la|sort
Eu amo tanto * nix e adoro ver a criatividade que entra em algumas dessas respostas ...
A minha não é tão chique no GNU Linux:
Dado que estou mais à vontade com meus aplicativos CLI Linux, também costumo atualizar o coreutils no OSX:
fonte
brew install bash
então deve funcionar! :)Para usuários de Mac, coreutils :
Supondo que seu sistema esteja pronto para homebrew :
fonte
gls
em vez. Direito?PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
.Há certas coisas que quero ver em uma lista de diretórios e, até o momento, nenhuma das respostas aqui atende a todos os requisitos abaixo. Meus requisitos para uma listagem de diretório:
./
e../
), arquivos e links--group-directories-first
não funcionam no Git Bash para WindowsDepois de muitos hackers, finalmente criei uma linha (embora muito longa ;-)) com a qual estou satisfeito. Eu atribuí isso a um alias chamado 'dir':
Para facilitar o gerenciamento, criei comandos separados para exibir cada segmento da lista de diretórios da minha preferência e os reuni usando o
&&
operador.ls -dlF --color * .* | head -n2
- Extraia./
e../
. Não queremos repassá-lossort
porque eles já estão na ordem correta e a classificação deles pode resultar na../
listagem primeiro. A-d
opção é se livrar da linha "total"; Eu gosto de adicionar-F
para mostrar a barra final dos diretórios (ele também marcará links simbólicos com "@" quando você fizer um simplesls -F
).ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
- Extraia os diretórios e os ordene por nome de arquivo (coluna 9), ignorando os caracteres não-alfa / espaço (d
opção) e os caracteres (f
opção). Als -A
opção exclui./
e../
da listagem, pois já as extraímos na etapa anterior. Eu costumo prefixar todos os comandosgrep
esort
com aLC_ALL=C
redefinição local para que (1) a saída seja consistente entre os shells do Unix e (2) às vezes você possa ver um desempenho mais rápido, já que não possui mais a sobrecarga do pesado caractere UTF-8 definido como Lide com.ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
- Isso é semelhante ao passo acima, mas desta vez estamos classificando arquivos e links simbólicos.find -maxdepth 1 -type d ! -name . | wc -l
- Obtenha o número de diretórios, excluindo./
e../
.find -maxdepth 1 -type f | wc -l
- Obtenha o número de arquivos.find -maxdepth 1 -type l | wc -l
- Obtenha o número de links simbólicos.du -hs | cut -f 1
- Extraia o tamanho total de todos os subdiretórios no formato legível por humanos.find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
- Extraia o tamanho total de todos os arquivos em formato legível por humanos.Vamos ver o nosso novo
dir
apelido em ação!ANTES:
DEPOIS DE:
Uma desvantagem menor é que você não pode ter listas coloridas, pois os caracteres de controle de cores que cercam os nomes dos arquivos tornam a classificação muito pouco confiável.
ATUALIZAR
O alias acima era dolorosamente lento quando executado a partir do diretório raiz de um sistema de arquivos profundo, por isso atualizei para este comando mais simples, mas com muito mais desempenho:
Saída de amostra:
Como a nova versão do Git Bash para Windows suporta
--group-directories-first
, não precisamos mais voltar a usá-losort
. Mesmo que o novo alias não exiba tanta informação quanto o alias anterior, os ganhos de desempenho valem a pena. Como vantagem, você também recebe cores!fonte
Você tem várias opções, dependendo se deseja manter a ordem alfabética.
Você pode simplesmente tentar:
ou isso, para manter a ordem alfabética dos arquivos com as mesmas permissões:
ou, como onze81 disse (mas esta versão lista tudo):
fonte
ls- al|sort -k1 -r
funciona. O que estava faltando é apenas a-r
bandeira../
e../
não serão as duas primeiras linhas, nessa ordem. Fora isso, concordo que é a solução mais eficiente.Para a resposta de delerious010 , gostaria de acrescentar que, se você quiser pedidos com estilo antigo:
(ou use LC_ALL ou LANGUAGE ou LC_COLLATE definido como "C").
Isso dará algo semelhante a:
Embora, se bem me lembro, os arquivos de ponto oculto originalmente aparecessem antes dos diretórios.
fonte
Aqui está uma função para fazer isso (bash ou zsh): E ... eu não estou sugerindo que esta é a melhor maneira, mas é a que eu criei e estou usando agora:
fonte
ls -l
) para filtrar por tipo de arquivo assim. Além disso, este comando será interrompido nos espaços (no bash). Você precisa citar da seguinte maneira:"$@"
Se você quiser usar essa abordagem, poderá fazer algo assim:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
ls -laX
mostrará os diretórios primeiro em ordem alfabética, mas estragará a lista de arquivos.Opções longas:
fonte
Outra maneira ...
OU
OU
fonte
TL; DR
Explicação
Eu uso uma combinação das soluções fornecidas nas respostas e comentários aqui.
Padrão
ls
Antes de tudo, substituo o comportamento padrão para
ls
:-l
: Sempre exiba a lista como uma lista vertical unidimensional-h
: Exibe tamanhos de arquivo legíveis por humanos (por exemplo, 4.0K em vez de 4096)-F
: Exibir indicadores como uma barra final para diretóriosEstendido
ll
Em seguida, escrevo uma função que contém a lógica de classificação. Para cada um deles
ls
, passo quaisquer argumentos passados originalmente para ele. Isso me permite usar o alias de um diretório de trabalho diferente daquele que eu quero listar (ou sejals -a ~
).Além disso, cada chamada para
ls
é canalizada para umgrep
comando. Aqui, a classificação acontece.ls -l | grep "^d"
por exemplo, lista apenas diretórios. Se os diretórios devem ser listados primeiro, isso também deve vir em primeiro lugar na função. A próxima coisa são os arquivos.Por fim, mostro tudo o que não é um diretório nem um arquivo (nem a linha que mostra o tamanho total do conteúdo do diretório). Isso é feito grepping diretamente, entradas regulares de arquivos e a entrada total e, em seguida, invertendo o resultado por meio do
-v
argumentoFinalmente, alias a função para um novo comando. Em particular, não quero sobrescrever
ls
caso minha função seja interrompida em alguns cenários. Então eu quero poder usarls
. Como alternativa, você sempre pode chamar ols
comando sem serrilhado chamando\ls
.Notas
;
vez de&&
como um delimitador para os comandos. Caso contrário, não será possível listar o conteúdo de diretórios que não contêm diretórios (o primeiro comando ls é avaliado como falso, não permitindo a execução do próximo comando, pois ele é acoplado a&&
.;
Evita isso.)fonte
Esta é uma solução de script. Lista apenas os nomes, sem dados do inode, alfabéticos, sem distinção entre maiúsculas e minúsculas, formatados em colunas. Embora seja maior de linha em vez de maior de coluna, como a saída padrão de ls. As colunas ficam um pouco confusas se houver um nome de arquivo com> 26 caracteres.
E outro, com alguma formatação extra.
A saída do último se parece com o seguinte, menos as cores:
Lembre-se de não usar o alias ou alterar o comportamento padrão de ls, pois esse script o chama.
fonte