Há certas coisas que quero ver em uma listagem de diretório 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 faz distinção entre maiúsculas e minúsculas
- A classificação ignora todos os principais caracteres não alfa 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 tem que ter a mesma aparência no Linux e no Windows (Git Bash shell) - isso foi o mais difícil de acertar, pois opções convenientes como
--group-directories-first
não funcionam no Git Bash para Windows
Depois de muito hacking, eu finalmente encontrei um one-liner (embora uma linha muito longa ;-)) com o qual estou satisfeito. Eu atribuí isso a um apelido 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 tornar as coisas mais fáceis de gerenciar, criei comandos separados para produzir cada segmento da listagem de diretórios para o meu gosto e, em seguida, reuni-los usando o operador &&
.
-
ls -dlF --color * .* | head -n2
- extrair ./
e ../
. Não queremos passar esses dados por sort
porque eles já estão na ordem correta e classificá-los pode resultar em ../
sendo listado primeiro. A opção -d
é livrar-se da linha "total"; Eu gosto de adicionar -F
para mostrar a barra final para diretórios (também marcará links simbólicos com "@" quando você faz um ls -F
simples).
-
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
- Extraia os diretórios e classifique-os por nome de arquivo (9ª coluna), ignorando caracteres não alfa / espaço ( d
option) e caractere ( f
option). A opção ls -A
exclui ./
e ../
da listagem, pois já as extraímos na etapa anterior. Prefiro todos os comandos grep
e sort
com a redefinição de LC_ALL=C
locale para que (1) a saída seja consistente em shells Unix e (2) você possa ver um desempenho mais rápido, pois não tem mais a sobrecarga do pesado conjunto de caracteres UTF-8 para lidar.
-
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
- Isso é semelhante à etapa 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
- Extrai o tamanho total de todos os subdiretórios em formato legível.
-
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
- Extrai o tamanho total de todos os arquivos em formato legível.
Vamos ver nosso novo dir
alias em ação!
ANTES:
$ ls -alF
total 22
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
DEPOIS:
$ dir
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
5 Dir(s) 2.8M 6 File(s) 31K 0 Link(s)
Uma pequena desvantagem é que você não pode ter listagens coloridas, já que os caracteres de controle de cores que cercam os nomes dos arquivos tornam a classificação muito pouco confiável.
UPDATE
O alias acima era dolorosamente lento quando executado a partir do diretório raiz de um sistema de arquivos profundo, por isso atualizei para esse 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"}'
Exemplo de saída:
$ dir
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom 0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom 0 Jun 16 2016 temp/
drwxr-xr-x 1 Tom 0 Jul 13 2016 vimfiles/
-rw-r--r-- 2 Tom 365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom 2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom 2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom 1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom 8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom 2444 Jul 13 2016 _vimrc
33819 bytes
Como a nova versão do Git Bash para Windows é compatível com --group-directories-first
, não precisamos mais recorrer a sort
. Embora o novo alias não exiba tanta informação quanto o alias anterior, os ganhos de desempenho valem mais do que isso. Como um bônus, você também ganha cores!