Como posso modificar meu comando `ls`?

12

Quando digito ls, recebo a lista normal ou quando digito ls -larecebo uma versão detalhada com tudo ...

Mas eu odeio o layout ls, é pouco intuitivo para a maior parte do meu uso.

Existe alguma maneira de modificar (sem alterar o código de sor ls, os scripts bash estão bem no entanto), lspara que seja exibido em vez de

-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename0
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename1
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename2
drwx------ 13 user group 123546 2011-01-01 11:11 directory0
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename3
drwx------ 13 user group 123546 2011-01-01 11:11 directory1

Eu posso obter uma lista mais como:

DIRS
directory0 1293880260 700 user:group
directory1 1293880260 700 user:group

FILES
filename0 1293880260 751 user:group
filename1 1293880260 755 user:group
filename2 1293880260 777 user:group
filename3 1293880260 705 user:group

Ou alguma outra variação.

Enquanto isso, preservando a capacidade de usar sinalizadores e outras opções.

Incógnito
fonte

Respostas:

15

Você pode escrever um script bash chamado ~/bin/lsque deve substituir /bin/ls. lembre-se de correr chmod +x ~/bin/ls.

Acabei de escrever isso que parece fazer a maior parte do que você deseja realizar (incluindo transmitir argumentos extras)

#!/bin/bash

DIRS="`/bin/ls --color=auto -l $@ | grep ^d`"
FILES="`/bin/ls --color=auto -l $@ | grep ^\-`"

if [ "$DIRS" ]
then
    echo "DIRECTORIES"
    echo -e "$DIRS\

"
fi

if [ "$FILES" ]
then
    echo "FILES"
    echo "$FILES\

"
fi

Alguém pode querer arrumar um pouco ou melhorar a formatação da saída, mas lá está. Seu para fazer o que quiser.

E aqui está uma amostra de saída genuína:

ls
DIRECTORIES
drwxr-xr-x 4 oli oli     4096 2010-12-16 15:40 markitup
drwxr-xr-x 7 oli oli     4096 2011-01-16 16:58 media
drwxr-xr-x 3 oli oli     4096 2010-12-16 15:41 post
drwxr-xr-x 9 oli oli     4096 2010-09-16 05:23 templates

FILES
-rw-r--r-- 1 oli oli  5361664 2010-09-06 16:32 db.db
-rw-r--r-- 1 oli oli        0 2008-12-11 09:22 __init__.py
-rwxr-xr-x 1 oli oli      542 2008-12-11 09:22 manage.py
-rw-r--r-- 1 oli oli       13 2010-03-23 18:14 settingsdev.py
-rw-r--r-- 1 oli oli     2642 2010-12-16 15:40 settings.py
-rw-r--r-- 1 oli oli     1818 2010-12-16 15:40 urls.py
-rw-r--r-- 1 oli oli      432 2010-06-22 20:54 views.py

E com argumentos:

ls -a
DIRECTORIES
drwxr-xr-x  8 oli oli     4096 2011-01-12 00:46 .
drwxr-xr-x 19 oli oli     4096 2011-04-13 17:24 ..
drwxr-xr-x  6 oli oli     4096 2010-02-03 13:50 .bzr
drwxr-xr-x  4 oli oli     4096 2010-12-16 15:40 markitup
drwxr-xr-x  7 oli oli     4096 2011-01-16 16:58 media
drwxr-xr-x  3 oli oli     4096 2010-12-16 15:41 post
drwxr-xr-x  9 oli oli     4096 2010-09-16 05:23 templates

FILES
-rw-r--r--  1 oli oli       65 2010-03-27 07:58 .bzrignore
-rw-r--r--  1 oli oli  5361664 2010-09-06 16:32 db.db
-rw-r--r--  1 oli oli        0 2008-12-11 09:22 __init__.py
-rwxr-xr-x  1 oli oli      542 2008-12-11 09:22 manage.py
-rw-r--r--  1 oli oli       13 2010-03-23 18:14 settingsdev.py
-rw-r--r--  1 oli oli     2642 2010-12-16 15:40 settings.py
-rw-r--r--  1 oli oli     1818 2010-12-16 15:40 urls.py
-rw-r--r--  1 oli oli      432 2010-06-22 20:54 views.py
Oli
fonte
7

Aqui está o meu jab rápido.

$ function lss { ls -l --group-directories-first --time-style +%s $@ | grep -v '^total' | awk 'BEGIN {print("DIRS")} {if (f!=1 && $1 ~ /^-/) {print "\nFILES"; f=1}; printf("%s\t%s %s %s:%s\n", $7, $6, $1, $3, $4);}'; }
$ alias ls='lss'
$ ls
DIRS
directory0  1305901476 drwxr-xr-x ak:ak
directory1  1305901476 drwxr-xr-x ak:ak

FILES
filename0   1305901484 -rw-r--r-- ak:ak
filename1   1305901484 -rw-r--r-- ak:ak
filename2   1305901484 -rw-r--r-- ak:ak
filename3   1305901484 -rw-r--r-- ak:ak

O benefício dessa abordagem é que ela não requer várias travessias de diretório e imprime a saída quando estiver pronta. Tente executar isso depois touch filename{0..10000}como teste.

Solte as linhas functione para torná-lo permanente.alias~/.bashrc

Benchmarking da Oli:

oli@bert:~/Desktop$ mkdir test
oli@bert:~/Desktop$ cd test
oli@bert:~/Desktop/test$ mkdir dir{0..100000}
oli@bert:~/Desktop/test$ touch filename{0..100000}

oli@bert:~/Desktop/test$ time /bin/ls>/dev/null

real    0m0.975s
user    0m0.860s
sys         0m0.110s

oli@bert:~/Desktop/test$ time ls --group-directories-first -l >/dev/null

real    0m1.810s
user    0m1.210s
sys         0m0.580s


oli@bert:~/Desktop/test$ time lss>/dev/null  # ændrük's method

real    0m2.035s
user    0m1.810s
sys         0m0.780s

oli@bert:~/Desktop/test$ time ~/bin/ls>/dev/null  # Oli's method

real    0m5.496s
user    0m4.290s
sys         0m1.460s
ændrük
fonte
4
Foram adicionados alguns testes de referência à sua postagem (como você mencionou). Sim, com mais de 100.000 diretórios e 100.000 arquivos, o seu leva menos da metade do tempo. Mas lspor si só ainda é muito mais rápido. De qualquer forma, este é um caso extremo. A maioria das pessoas nunca possui listas de diretórios tão grandes. Para pessoas normais, há pouca diferença observável. Bom awking embora. +1
Oli
4

ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

Mostra ... diretórios, arquivos normais, links nessa ordem.

Crie um alias e você está pronto para ir.

Encontrou outro método:

ls -l --color -h --group-directories-first

Este faz primeiro os diretórios e colore os nomes dos arquivos.

Em ~/.bashrcvocê pode criar um alias para este comando da seguinte maneira:

alias ls1='ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

Saída de amostra:

drwxr-xr-x 5 96 20/05/2011 13:41.
drwxr-xr-x 16 xxxx uuuu 96 05-03-2010 12:34 ..
drwx ------ 2 xxxx uuuu 96 13-02-2002 14:31 .ssh
drwxrwxr-x 2 xxxx uuuu 96 03-12-2009 13:49 .xxx
drwxrwxr-x 5 xxxx uuuu 96 06-12-2010 15:51 xxxxxx
-rw ------- 1 xxxx uuuu 05 05-05-05 14:12 .bash_history
-rw-r - r-- 1 xxxx uuuu 20 12-02-2009 09:33 .bash_logout
-rw-r - r-- 1 xxxx uuuu 29 2009-03-06 11:47 .bashrc
-rw-r - r-- 1 xxxx uuuu 80 20/05/2011 13:42 fff
-rw-rw-r-- 1 xxxx uuuu 03 2011-05-18 10:21 dffff

ou para o segundo: alias ls2=ls -l --color -h --group-directories-first

Saída de amostra:

drwxrwxr-x 5 xxxx uuuu 4.0K 06-12-2010 15:51 ddddd
-rw-r - r-- 1 xxxx uuuu 339M 20/05/2011 13:42 sssss
-rw-rw-r-- 1 xxxx uuuu 4.6M 18/05/2011 10:21 dxsssss
-rwxrwxr-x 1 xxxx uuuu 68 22/02/2011 15:55 5555
-rwxr - r-- 1 xxxx uuuu 20K 06-12-2010 16:11 ffff
ddddd estará em outra cor. adicione -apara incluir também arquivos ocultos.

e você criou um comando ls1 e ls2 para fazer isso.

Rinzwind
fonte
2

Estender as configurações de alias no .bashrc é a minha maneira preferida de obter comandos 'ls' mais convenientes. Eu gosto especialmente do 'lf' (requer a instalação de 'tree').

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias lf='tree -d -L 1'
Ralf Hersel
fonte
2

Uma das ferramentas mais poderosas nos sistemas Unix é o findcomando. Podemos usá-lo para emular lssaída com -lssinalizador e pesquisar por tipo de arquivo com -typesinalizador. Portanto, o que você vê abaixo é exatamente o mesmo comando, mas com a findpesquisa de dois tipos diferentes. printfAs instruções dizem apenas que você deseja que seja listado primeiro.

printf "****DIRS****\n"; find . -maxdepth 1 -type d -ls; echo "****FILES****"; find . -maxdepth 1 -type f -ls

Aqui está o exemplo de saída:

CURRENT DIR:[/home/xieerqi/bin]
$ printf "****DIRS****"; find . -maxdepth 1 -type d -ls; echo "****FILES****"; find . -maxdepth 1 -type f -ls                                 
****DIRS****
5795516    4 drwxrwxr-x   8 xieerqi  xieerqi      4096 Aug 19 16:25 .
5795514    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./c
5795511    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./python
5795153    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:41 ./perl
5795532    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./random
5795531    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./sh
5795141    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./cs2
****FILES****
5795538    4 -rw-rw-r--   1 xieerqi  xieerqi       178 Aug 19 16:25 ./somefile.txt
5795539    4 -rw-rw-r--   1 xieerqi  xieerqi       219 Aug 19 16:26 ./somefile2.txt

Observe que isso findlista todos os arquivos, incluindo os arquivos ocultos com o ponto inicial, por exemplo .bashrc.

Agora, para facilitar o acesso a este comando, crie um alias para isso no seu .bashrc. Eu fiz o meu assim

alias ls2='printf "****DIRS****\n"; find . -maxdepth 1 -type d -ls; echo "****FILES****"; find . -maxdepth 1 -type f -ls '

Faça a fonte bashrc com . .bashrcou saia e entre no terminal. Seu alias está pronto para ser usado sempre que você desejar.

Sergiy Kolodyazhnyy
fonte
Ferramenta mais poderosa? De fato. :)
AB
1

ls não suporta muita personalização de saída.

Usar

 ls --group-directories-first -l

para obter os dirs primeiro.

Dê uma olhada na limusine (não instalada por padrão) para uma alternativa ao ls que suporte mais personalização de saída (mas não suporta todas as opções de ls)

Florian Diesch
fonte
0

Meu mais recente lsmod ~/biné:

#!/bin/bash
ACCOUNT_ID=$UID
#
#SET ACCOUNT_NAME
ACCOUNT_NAME=$( cat /etc/passwd | grep $ACCOUNT_ID | cut -d: -f1 );

ls -l -F --color -h --group-directories-first $1 |\
    sed "s/$ACCOUNT_NAME/\$USER/g" | ack --passthru --color \\\$USER ;

PS Tinha que nomeá-lo ~/bin/mylsou ele ficará travado que nunca atinge o sistema ls.

Saída de amostra:

$ sudo mkdir -vp /temp/Nother_DIR | tee -a /tmp/record
mkdir: created directory `/temp'
mkdir: created directory `/temp/Nother_DIR'
$ sudo chown -vR $USER:$USER /temp | f | tee -a /tmp/record
changed ownership of `/temp/Nother_DIR' to $USER:$USER
changed ownership of `/temp' to $USER:$USER
$ cd /temp
$ touch a b c d
$ ln -sv d e | tee -a /tmp/record
`e' -> `d'
$ ln -sv e f | tee -a /tmp/record
`f' -> `e'
$ myls | tee -a /tmp/record
total 4.0K
drwxr-xr-x 2 $USER $USER 4.0K Sep 19 00:46 Nother_DIR
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 a
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 b
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 c
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 d
lrwxrwxrwx 1 $USER $USER    1 Sep 19 00:46 e -> d
lrwxrwxrwx 1 $USER $USER    1 Sep 19 00:46 f -> e
eu, agora
fonte
-1

Meu último mod ls em ~ / bin é:

#!/bin/bash
ACCOUNT_ID=$UID
# 
#SET ACCOUNT_NAME
ACCOUNT_NAME=$( cat /etc/passwd | grep $ACCOUNT_ID | cut -d: -f1 );  

ls -l -F --color -h --group-directories-first $1 |\  
    sed "s/$ACCOUNT_NAME/\$USER/g" | ack --passthru --color \\\$USER ;  

Desculpe pelo formato da postagem. Tentou tornar utilizável via copiar / colar, mas talvez não vá. Felicidades!
PS Tinha que chamá-lo de ~ / bin / myls ou ele ficará pendurado em um loop que nunca atinge os sl do sistema.

eu, agora
fonte
ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)"e/bin/ls -l -F ...
waltinator 04/12/2015