Jak mogę zmodyfikować moje polecenie `ls`?

12

Kiedy piszę ls, otrzymuję normalną listę, lub kiedy piszę ls -la, otrzymuję wersję ze wszystkimi szczegółami ...

Ale nienawidzę układu ls, to po prostu nieintuicyjne przez większość mojego użytku.

Czy jest jakiś sposób, który mogę zmodyfikować (bez zmiany kodu ls, skrypty bash są jednak w porządku), lswięc wyświetla się zamiast

-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

Mogę uzyskać listę bardziej jak:

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

Lub inna odmiana.

Tymczasem zachowując możliwość korzystania z flag i innych opcji.

Incognito
źródło

Odpowiedzi:

15

Możesz napisać skrypt bash o nazwie, ~/bin/lsktóry powinien zastąpić /bin/ls. pamiętaj, aby biec chmod +x ~/bin/ls.

Właśnie napisałem to, co wydaje się robić większość tego, co chcesz osiągnąć (w tym przekazywanie dodatkowych argumentów)

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

Ktoś może chcieć to trochę uporządkować lub poprawić formatowanie wyjściowe, ale proszę bardzo. Zrób co chcesz.

A oto kilka autentycznych próbek wyjściowych:

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

I z argumentami:

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
źródło
7

Oto moje szybkie dźgnięcie.

$ 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

Zaletą tego podejścia jest to, że nie wymaga wielu przeglądarek katalogów i drukuje dane wyjściowe, gdy są gotowe. Spróbuj uruchomić to później touch filename{0..10000}jako test.

Upuść linie functioni alias, ~/.bashrcaby stały.

Benchmarking od 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
źródło
4
Dodano pewne testy porównawcze do twojego postu (tak jak wspomniałeś). Tak, ponad 100 000 katalogów i 100 000 plików, zajmuje to mniej niż połowę czasu. Ale lssamo w sobie jest wciąż znacznie szybsze. Tak czy inaczej, jest to przypadek skrajny. Większość ludzi nigdy nie ma tak dużych katalogów. Dla normalnych ludzi nie ma zauważalnej różnicy. awkAle miło . +1
Oli
4

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

Pokazuje ... katalogi, normalne pliki, linki w tej kolejności.

Stwórz alias i gotowe.

Znaleziono inną metodę:

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

Ten robi najpierw katalogi i koloruje nazwy plików.

W ~/.bashrcmożesz utworzyć alias do tego polecenia w następujący sposób:

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

Przykładowe dane wyjściowe:

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

lub dla drugiego: alias ls2=ls -l --color -h --group-directories-first

Przykładowe dane wyjściowe:

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 18.05.2011 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 będzie w innym kolorze. dodaj, -aaby uwzględnić również ukryte pliki.

i stworzyłeś do tego polecenie ls1 i ls2.

Rinzwind
źródło
2

Rozszerzanie ustawień aliasów w .bashrc jest moim preferowanym sposobem uzyskiwania wygodniejszych poleceń „ls”. Szczególnie podoba mi się „lf” (wymaga instalacji „drzewa”).

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias lf='tree -d -L 1'
Ralf Hersel
źródło
2

Jednym z najpotężniejszych narzędzi w systemach uniksowych jest findpolecenie. Możemy go użyć do emulacji lsdanych wyjściowych z -lsflagą i wyszukiwania według typu pliku z -typeflagą. Zatem to, co widzisz poniżej, jest dokładnie tym samym poleceniem, ale przy findwyszukiwaniu dwóch różnych typów. printfinstrukcje tylko mówią, że chcesz, aby był na początku.

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

Oto przykładowe dane wyjściowe:

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

Zauważ, że findzawiera listę wszystkich plików, w tym na przykład pliki ukryte z wiodącą kropką .bashrc.

Teraz, aby ułatwić dostęp do tego polecenia, utwórz alias do tego w swoim .bashrc. Tak zrobiłem mój

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

Źródło bashrc z . .bashrclub wyjście i wejście do terminalu. Twój alias jest teraz gotowy do użycia w dowolnym momencie.

Sergiy Kolodyazhnyy
źródło
Najmocniejsze narzędzie? W rzeczy samej. :)
AB
1

ls nie obsługuje dużego dostosowania danych wyjściowych.

Posługiwać się

 ls --group-directories-first -l

żeby najpierw zdobyć katalog.

Spójrz na limuzynę (domyślnie nie instalowaną), aby znaleźć alternatywę dla ls, która obsługuje większą personalizację danych wyjściowych (ale nie obsługuje wszystkich opcji ls)

Florian Diesch
źródło
0

Mój najnowszy lsmod ~/binto:

#!/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 Musiał to nazwać, ~/bin/mylsinaczej zawiesi się w pętli, która nigdy nie dotrze do systemu ls.

Przykładowe dane wyjściowe:

$ 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
moja kolej
źródło
-1

Mój najnowszy mod ls w ~ / bin to:

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

Przepraszamy za format postu. Próbowałem uczynić możliwym do użycia przez kopiowanie / wklejanie, ale może nie idź. Twoje zdrowie!
PS Musiał to nazwać ~ / bin / myls, inaczej zawiesi się w pętli, która nigdy nie dotrze do ls systemu.

moja kolej
źródło
ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)"oraz/bin/ls -l -F ...
waltinator,