¿Cómo puedo modificar mi comando `ls`?

12

Cuando escribo ls, obtengo la lista normal, o cuando escribo ls -laobtengo una versión detallada con todo ...

Pero odio el diseño de ls, no es intuitivo para la mayoría de mi uso.

¿Hay alguna forma de modificar (sin cambiar el código de hechizo ls, sin embargo, los scripts bash están bien) lspara que se muestre en lugar 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

Puedo obtener una lista más 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

O alguna otra variación.

Mientras tanto, conserva la capacidad de usar banderas y otras opciones.

Incógnito
fuente

Respuestas:

15

Podría escribir un script bash llamado ~/bin/lsque debería anular /bin/ls. recuerda correr chmod +x ~/bin/ls.

Acabo de escribir esto que parece hacer la mayor parte de lo que quieres lograr (incluyendo pasar argumentos adicionales)

#!/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

Alguien puede querer arreglarlo un poco o mejorar el formato de salida, pero ahí lo tienes. Tuyo para hacer lo que quieras.

Y aquí hay algunos resultados de muestra genuinos:

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

Y con 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
fuente
7

Aquí está mi pinchazo 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

El beneficio de este enfoque es que no requiere múltiples recorridos de directorio e imprime el resultado cuando está listo. Intenta ejecutar esto después touch filename{0..10000}como prueba.

Suelta las líneas functiony para hacerlo permanente.alias~/.bashrc

Evaluación comparativa de 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
fuente
44
Agregó algunos puntos de referencia a su publicación (como lo mencionó). Sí, más de 100,000 directorios y 100,000 archivos, el tuyo toma menos de la mitad del tiempo. Pero lspor sí solo es mucho más rápido. De cualquier manera, este es un caso extremo. La mayoría de las personas nunca tienen listados de directorios tan grandes. Para las personas normales, hay poca diferencia observable. Agradable awkaunque. +1
Oli
4

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

Muestra ... directorios, archivos normales, enlaces en ese orden.

Conviértalo en un alias y listo.

Encontré otro método:

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

Este primero realiza directorios y colorea los nombres de los archivos.

En ~/.bashrcpuede crear un alias para este comando de la siguiente manera:

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

Salida de muestra:

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

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

Salida de muestra:

drwxrwxr-x 5 xxxx uuuu 4.0K 06/12/2010 15:51 ddddd
-rw-r - r-- 1 xxxx uuuu 339M 2011-05-20 13:42 sssss
-rw-rw-r-- 1 xxxx uuuu 4.6M 2011-05-18 10:21 dxsssss
-rwxrwxr-x 1 xxxx uuuu 68 2011-02-22 15:55 5555
-rwxr - r-- 1 xxxx uuuu 20K 2010-12-06 16:11 ffff
ddddd estará en otro color. agregar -atambién para incluir archivos ocultos.

y creaste un comando ls1 y ls2 para hacer esto.

Rinzwind
fuente
2

Ampliar la configuración de alias en .bashrc es mi forma preferida de obtener comandos 'ls' más convenientes. Me gusta especialmente el 'lf' (requiere la instalación del 'árbol').

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

Una de las herramientas más poderosas en los sistemas Unix es el findcomando. Podemos usarlo para emular la lssalida con -lsbandera y buscar por tipo de archivo con -typebandera. Por lo tanto, lo que ve a continuación es exactamente el mismo comando, pero con la findbúsqueda de dos tipos diferentes. printflas declaraciones solo te dicen que quieres que aparezca primero.

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

Aquí está la salida de muestra:

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

Tenga en cuenta que findenumera todos los archivos, incluidos los archivos ocultos con el punto inicial, por ejemplo .bashrc.

Ahora, para facilitar el acceso a este comando, cree un alias para eso en su .bashrc. He hecho el mío así

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

Fuente bashrc con . .bashrco salir y entrar en la terminal. Su alias ahora está listo para usar cuando lo desee.

Sergiy Kolodyazhnyy
fuente
¿La herramienta más poderosa? En efecto. :)
AB
1

ls no admite mucha personalización de salida.

Utilizar

 ls --group-directories-first -l

solo para obtener los directorios primero.

Eche un vistazo a la limusina (no instalada de forma predeterminada) para encontrar una alternativa a ls que admita una mayor personalización de salida (pero no admite todas las opciones de ls)

Florian Diesch
fuente
0

Mi último lsmod ~/bines:

#!/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 ;

PD Tenía que nombrarlo ~/bin/mylso se colgará en un bucle que nunca llega al sistema ls.

Salida de muestra:

$ 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
yo ahora
fuente
-1

Mi último mod ls en ~ / bin es:

#!/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 ;  

Perdón por el formato de la publicación. Intenté utilizarlo mediante copiar / pegar, pero tal vez no vaya. ¡Salud!
PS Tenía que nombrarlo ~ / bin / myls o se colgará en un bucle que nunca llega al ls del sistema.

yo ahora
fuente
ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)"y/bin/ls -l -F ...
waltinator