Comment puis-je modifier ma commande `ls`?

12

Quand je tape ls, j'obtiens la liste normale, ou quand je tape, ls -laj'obtiens une version détaillée avec tout ...

Mais je déteste la disposition de ls, c'est juste peu intuitif pour la plupart de mon utilisation.

Y a-t-il un moyen que je peux modifier (sans changer le code sorcier de ls, les scripts bash sont corrects cependant) lsdonc il est affiché au lieu 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

Je peux obtenir une liste plus comme:

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 une autre variante.

Pendant ce temps, préservant la possibilité d'utiliser des indicateurs et d'autres options.

Incognito
la source

Réponses:

15

Vous pouvez écrire un script bash appelé ~/bin/lsqui devrait remplacer /bin/ls. n'oubliez pas de courir chmod +x ~/bin/ls.

Je viens d'écrire ceci qui semble faire la plupart de ce que vous voulez accomplir (y compris la transmission d'arguments supplémentaires)

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

Quelqu'un voudra peut-être ranger un peu cela ou améliorer le formatage de sortie, mais c'est parti. À vous de faire ce que vous voulez.

Et voici une sortie d'échantillon authentique:

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

Et avec des arguments:

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
la source
7

Voici mon coup rapide.

$ 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

L'avantage de cette approche est qu'elle ne nécessite pas plusieurs traversées de répertoire et imprime la sortie lorsqu'elle est prête. Essayez d'exécuter ceci après touch filename{0..10000}comme test.

Déposez les lignes functionet pour le rendre permanent.alias~/.bashrc

Analyse comparative d'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
la source
4
Ajout d'une analyse comparative à votre message (comme vous l'avez mentionné). Oui, plus de 100 000 répertoires et 100 000 fichiers, le vôtre prend moins de la moitié du temps. Mais lsen soi, c'est encore beaucoup plus rapide. De toute façon, c'est un cas de bord. La plupart des gens n'ont jamais de listes d'annuaires aussi énormes. Pour les gens normaux, il y a peu de différence observable. Sympa awkcependant. +1
Oli
4

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

Affiche ... répertoires, fichiers normaux, liens dans cet ordre.

Faites-en un alias et vous êtes prêt à partir.

Trouvé une autre méthode:

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

Celui-ci fait d'abord les répertoires et colore les noms de fichiers.

Dans ~/.bashrcvous pouvez créer un alias pour cette commande comme ceci:

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

Exemple de sortie:

drwxr-xr-x 5 96 2011-05-20 13:41.
drwxr-xr-x 16 xxxx uuuu 96 2010-03-05 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

ou pour le second: alias ls2=ls -l --color -h --group-directories-first

Exemple de sortie:

drwxrwxr-x 5 xxxx uuuu 4.0K 2010-12-06 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 sera dans une autre couleur. ajouter -apour inclure également les fichiers cachés.

et vous avez créé une commande ls1 et ls2 pour ce faire.

Rinzwind
la source
2

L'extension des paramètres d'alias dans .bashrc est ma façon préférée d'obtenir des commandes 'ls' plus pratiques. J'aime particulièrement le 'lf' (nécessite l'installation 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
la source
2

L'un des outils les plus puissants des systèmes Unix est la findcommande. Nous pouvons l'utiliser pour émuler la lssortie avec -lsindicateur et rechercher par type de fichier avec -typeindicateur. Ainsi, ce que vous voyez ci-dessous est exactement la même commande, mais avec la findrecherche de deux types différents. printfles instructions indiquent seulement que vous voulez que la liste soit la première.

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

Voici un exemple de sortie:

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

Remarquez, qui findrépertorie tous les fichiers, y compris les fichiers cachés avec le point de tête, par exemple .bashrc.

Maintenant, pour rendre cette commande plus facile d'accès, créez un alias à celui de votre .bashrc. J'ai fait le mien comme ça

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

Bashrc source avec . .bashrcou quitter et entrer dans le terminal. Votre alias est maintenant prêt à être utilisé à tout moment.

Sergiy Kolodyazhnyy
la source
L'outil le plus puissant? En effet. :)
AB
1

ls ne prend pas en charge beaucoup de personnalisation de sortie.

Utilisation

 ls --group-directories-first -l

pour obtenir les dirs en premier.

Jetez un œil à limo (non installé par défaut) pour une alternative à ls qui prend en charge plus de personnalisation de sortie (mais ne prend pas en charge toutes les options de ls)

Florian Diesch
la source
0

Mon dernier lsmod en ~/binest:

#!/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 ~/bin/mylsJe devais le nommer ou il se bloquerait en boucle qui n'atteindrait jamais le système ls.

Exemple de sortie:

$ 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
moi maintenant
la source
-1

Mon dernier mod ls dans ~ / bin est:

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

Désolé pour le format du message. J'ai essayé de le rendre utilisable via copier / coller, mais peut-être pas. À votre santé!
PS J'ai dû le nommer ~ / bin / myls ou il se bloque en boucle qui n'atteint jamais le ls du système.

moi maintenant
la source
ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)"et/bin/ls -l -F ...
waltinator