Wie kann ich meinen ls-Befehl ändern?

12

Wenn ich tippe ls, erhalte ich die normale Liste, oder wenn ich tippe, ls -laerhalte ich eine Detailversion mit allem ...

Aber ich hasse das Layout von ls, es ist für die meisten meiner Anwendungen einfach nicht intuitiv.

Gibt es eine Möglichkeit, die ich ändern kann (ohne den sorcecode von zu ändern)? ls , Bash-Skripte sind jedoch in Ordnung), lsso dass sie statt angezeigt werden

-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

Ich kann eine Liste bekommen wie:

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

Oder eine andere Variante.

In der Zwischenzeit kann die Verwendung von Flags und anderen Optionen beibehalten werden.

Inkognito
quelle

Antworten:

15

Sie könnten ein Bash-Skript namens schreiben ~/bin/ls, das überschreiben sollte /bin/ls. Vergiss nicht zu rennen chmod +x ~/bin/ls.

Ich habe gerade das geschrieben, was das meiste zu tun scheint, was Sie erreichen wollen (einschließlich der Weitergabe zusätzlicher Argumente).

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

Vielleicht möchte jemand das ein wenig aufräumen oder die Ausgabeformatierung verbessern, aber los geht's. Mit dir kannst du machen, was du willst.

Und hier ist eine echte Beispielausgabe:

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

Und mit Argumenten:

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
quelle
7

Hier ist mein kurzer Schubs.

$ 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

Der Vorteil dieses Ansatzes besteht darin, dass nicht mehrere Verzeichnisdurchläufe erforderlich sind und die Ausgabe so gedruckt wird, wie sie bereit ist. Versuchen Sie dies später touch filename{0..10000}als Test auszuführen.

Ziehen Sie die functionund alias-Linien hinein ~/.bashrc, um es dauerhaft zu machen.

Benchmarking von 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
quelle
4
Deinem Beitrag wurde ein Benchmarking hinzugefügt (wie du es erwähnt hast). Ja, über 100.000 Verzeichnisse und 100.000 Dateien, Ihre nehmen weniger als die Hälfte der Zeit in Anspruch. Allein lsgeht es aber noch viel schneller. In jedem Fall ist dies ein Randfall. Die meisten Leute haben nie so große Verzeichnislisten. Für normale Menschen gibt es kaum erkennbare Unterschiede. Schön, awkwenn. +1
Oli
4

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

Zeigt ... Verzeichnisse, normale Dateien, Links in dieser Reihenfolge.

Machen Sie es zu einem Alias ​​und Sie können loslegen.

Eine andere Methode gefunden:

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

Dieser führt zuerst Verzeichnisse aus und färbt die Dateinamen ein.

In können ~/.bashrcSie einen Alias ​​für diesen Befehl wie folgt erstellen:

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

Beispielausgabe:

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 13.02.2009 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 2011-05-20 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 2011-05-20 13:42 fff
-rw-rw-r-- 1 xxxx uuuu 03 2011-05-18 10:21 dffff

oder für den zweiten: alias ls2=ls -l --color -h --group-directories-first

Beispielausgabe:

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 wird in einer anderen Farbe sein. hinzufügen, -aum auch versteckte Dateien einzuschließen.

und Sie haben einen Befehl ls1 und ls2 erstellt, um dies zu tun.

Rinzwind
quelle
2

Das Erweitern der Alias-Einstellungen in .bashrc ist meine bevorzugte Methode, um bequemere 'ls'-Befehle zu erhalten. Ich mag besonders das 'lf' (erfordert die Installation von '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
quelle
2

Eines der mächtigsten Werkzeuge in Unix-Systemen ist der findBefehl. Wir können damit die lsAusgabe mit -lsflag emulieren und nach Dateityp mit -typeflag suchen . Was Sie unten sehen, ist also genau derselbe Befehl, aber mit der findSuche nach zwei verschiedenen Typen. printfAussagen sagen nur, dass Sie möchten, dass es zuerst aufgeführt wird.

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

Hier ist eine Beispielausgabe:

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

Beachten Sie, dass hier alle Dateien findaufgelistet werden, einschließlich der versteckten Dateien mit dem führenden Punkt ..bashrc

Um den Zugriff auf diesen Befehl zu vereinfachen, erstellen Sie einen Alias ​​für diesen Befehl in Ihrem .bashrc. Ich habe es mir so gemacht

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

Quellbashrc mit . .bashrcoder beenden und Terminal betreten. Ihr Alias ​​kann jetzt jederzeit verwendet werden.

Sergiy Kolodyazhnyy
quelle
Stärkstes Werkzeug? Tatsächlich. :)
AB
1

ls unterstützt nicht viele Anpassungen der Ausgabe.

Verwenden

 ls --group-directories-first -l

um nur die dirs zuerst zu bekommen.

Werfen Sie einen Blick auf die Limousine (nicht standardmäßig installiert), um eine Alternative zu ls zu finden, die mehr Anpassungsmöglichkeiten für die Ausgabe bietet (aber nicht alle Optionen von unterstützt ls).

Florian Diesch
quelle
0

Mein neuester lsMod in ~/binist:

#!/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 Musste es benennen ~/bin/mylsoder es wird in einer Schleife hängen, die nie das System erreicht ls.

Beispielausgabe:

$ 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
me_now
quelle
-1

Mein neuester ls Mod in ~ / bin ist:

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

Entschuldigung für das Format des Beitrags. Versucht, per Kopieren / Einfügen nutzbar zu machen, aber vielleicht geht das nicht. Prost!
PS Musste es ~ / bin / myls nennen oder es hängt in einer Schleife, die niemals die ls des Systems erreicht.

me_now
quelle
ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)" und /bin/ls -l -F ...
Waltinator