Jak mogę sprawić, aby „ls” wyświetlał najpierw pliki kropkowe?

46

Gdzieś po drodze spieprzyłem moje polecenie ls i teraz dostaję tę kolejność podczas uruchamiania

$ ls -AhHl --color=auto
-rwxr-xr-x 1 clang clang  640 Mar  1 02:46 apple-touch-icon-precomposed.png
-rwxr-xr-x 1 clang clang  784 Jul 12 02:54 crossdomain.xml
-rwxr-xr-x 1 clang clang 1.2K Mar  1 02:46 favicon.ico
drwxr-xr-x 8 clang clang 4.0K Jul 12 23:50 .git
-rw-r--r-- 1 clang clang   17 Feb 29 19:48 .gitignore
-rwxr-xr-x 1 clang clang 1.4K Jul 12 02:54 humans.txt

Co takiego zrobiłem, że zignorowałem pliki kropkowe i zamiast tego posortowałem według pierwszej litery?

Wyjście locale:

$ locale
LANG=
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
clang1234
źródło

Odpowiedzi:

47

Spróbuj dodać

export LC_COLLATE="C"

w plikach dot lub zmieniając LC_ALLprzypisanie na:

export LC_ALL="C"

Kontroluje to sposób działania sortowania na poziomie znaków - podczas gdy domyślnie sortowanie plików kropkowych będzie odbywało się w linii, spowoduje to, że sortlisty plików kropkowych będą pierwsze.

Należy jednak pamiętać, że w zasadzie zatrzyma to obsługę rzeczywistych ustawień regionalnych we wszystkich narzędziach obsługujących ustawienia regionalne.


Aby przejść dalej, cytując podręcznik GNU Coreutils (moje podkreślenie):

Jeśli używasz ustawień narodowych innych niż POSIX (np. Przez ustawienie LC_ALLna en_US), sortowanie może dać wynik sortowany inaczej niż jesteś przyzwyczajony.

W takim przypadku ustaw LC_ALLzmienną środowiskową na C. Pamiętaj, że ustawienie LC_COLLATEma tylko dwa problemy. Po pierwsze, jest nieskuteczne, jeśli LC_ALLjest również ustawione. Po drugie, ma niezdefiniowane zachowanie, jeśli LC_CTYPE(lub LANG, jeśli LC_CTYPEjest nieustawione) jest ustawione na niezgodną wartość. Na przykład zachowanie LC_CTYPEjest niezdefiniowane, jeśli jest, ja_JP.PCKale LC_COLLATEjest en_US.UTF-8.

slhck
źródło
2
Ustawienie LC_ALL = „C” załatwiło sprawę! Dzięki za szybką odpowiedź
clang1234,
7
Ustawienie LC_ALL = „C” spowoduje ls????????
zmianę
Pamiętaj, że dodając export LC_ALL="C"do plików dot, skutecznie utracisz wsparcie dla faktycznych ustawień narodowych we wszystkich narzędziach obsługujących ustawienia regionalne. Chociaż problem drukowania wskazany przez @ohho można rozwiązać za pomocą odpowiedzi Faroula , wprowadzisz problemy z sortowaniem : sortowanie nastąpi tylko według wartości bajtów, w wyniku czego w sortowaniu (a) nieoczekiwanie rozróżniana jest wielkość liter i (b) niezmiennie miejsca znaki akcentowane. po wszystkich nieakcentowanych.
mklement0
35

Aby uniknąć jakichkolwiek zmian systemowych bez rzeczywistej potrzeby, można zmienić tylko sposób działania lsbieżącego użytkownika, dodając alias do .bashrc:

alias ll='LC_COLLATE=C ls -alF'

Najpierw sortuje pliki kropek, pozwala poprawnie obsługiwać (wyświetlać i sortować) „nietypowe” zestawy znaków, takie jak cyrylica. Jedynym winowajcą, że w sortowaniu rozróżniana jest wielkość liter.

Źródło: http://ubuntuforums.org/showthread.php?t=816753

Andrey Loskutov
źródło
3
To najlepsza jak dotąd odpowiedź
Engineer Dollery
Piękny. Znacznie lepiej niż zmiana konfiguracji całego systemu (co może powodować problemy z niektórymi modułami Pythona).
Gui Ambros
1
To była najbardziej pomocna odpowiedź. Ponadto w środowisku, w którym LC_ALLjest już ustawione coś niezgodnego z sortowaniem / podnoszeniem plików dot do góry lslisty, użyj alias ll='LC_ALL=C ls -alF'zamiast tego, ponieważ LC_COLLATEnie zastępuje LC_ALL.
matty
8

Oprawa

LC_ALL="C.UTF-8"

działa dla mnie dobrze - umlauts, a „ls -la” najpierw wyświetla pliki kropkowe.

Faroul
źródło
3
Pliki kropkowe są wymienione jako pierwsze, ale teraz nazwy plików rozpoczynające się od dużej litery są wyświetlane przed tymi, które zaczynają się od małej litery.
Chnossos,
1
+1 za zbliżenie się do zaakceptowanej odpowiedzi, ale w celu podsumowania ograniczeń: w sortowaniu rozróżniana jest wielkość liter , a znaki obce - mimo że są teraz drukowane poprawnie z powodu UTF-8- nie zostaną poprawnie posortowane .
mklement0
3
C.UTF-8jest niepoprawnym ustawieniem regionalnym, więc ustawienia powracają do C. Nadal tracisz obsługę UTF-8. W rzeczywistości jest nawet gorzej, ponieważ LC_ALL=Cwiększość programów wyświetla poprawnie większość znaków wielobajtowych , ale w LC_ALL=something_invalidniektórych programach nie (np. `Ls).
Martin Tournoij
@MartinTournoij, ale jeśli Stéphane Chazelas mówi inaczej o systemach GNU (a więc prawdopodobnie Debianie i Linuksie w ogóle), co jest poprawne?
muru
@muru Nie jestem pewien, myślę, że będziesz musiał zapytać Stéphane'a? Wiem tylko, że localewydaje się , że popełniam błąd przy LC_ALL=C.UTF-8: gist.github.com/Carpetsmoker/ef09b3734b29372939f97107413d7733 - czyli na Arch Linux.
Martin Tournoij,
3

Listy stron podręcznika ls (1):

-v naturalny rodzaj (wersji) liczb w tekście

Wydaje się, że zmienia to sposób sortowania kropek i najpierw grupuje pliki kropkowe. Mam:

alias ls='ls -vAF'
alias ll='ls -l'

w moim ~ / .bashrc.

Vince Valenti
źródło
1

Pomysł na ścianę

Oświadczenie: Dla większości z was będzie to przesada. Ale robię to od 1995 roku i mam umiejętności, aby mój świat był dokładnie taki, jak tego chcę. Więc dlaczego nie?

Bardzo lubię używać różnych metod sortowania ls, szczególnie -rt(które są sortowane według ree zmodyfikowanych time). Postanowiłem więc spróbować czegoś szalonego i użyć awk do sortowania.

# save as ~/.ls.awk
# inpsired by http://superuser.com/questions/448291/how-can-i-make-ls-show-dotfiles-first

{
    if($1 == "total"){
        print $0
        next
    }
    # may need to adjust $9 to match your name column
    if(match($9, /^(\033\[[0-9]*m)*\./)) # optionally look past xterm highlighting like: ^[[34m
        df[++dd] = $0
    else
        nf[++nn] = $0
}
END{
    while (++d in df)
        print df[d]
    while (++n in nf)
        print nf[n]
}

Teraz zamiast definiować alias bash, definiuję funkcję bash (ponieważ aliasy mogą dołączać tylko argumenty na końcu, ale funkcje mogą ich używać w dowolnym miejscu)

ll(){ CLICOLOR_FORCE=1 ls -lhA $* | awk -f ~/.ls.awk; }

Aby zobaczyć wyniki

Utwórzmy przykładowe pliki:

for n in 4 .4 3 .3 2 .2 1 .1; do touch $n; sleep 1; done

Używanie zwykłego ls

$ ls -lA
total 8
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
$ ls -lArt

total 8
-rwxr-xr-x  1 bbronosky  staff  285 Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 4
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 3
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .3
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 2
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .2
-rwxr-xr-x  1 bbronosky  staff    0 Dec  1 00:25 1
-rw-r--r--  1 bbronosky  staff    0 Dec  1 00:25 .1

Używam mojej funkcji filtrującej za pomocą awk

$ ll
total 8
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4

$ ll -rt
total 8
-rwxr-xr-x  1 bbronosky  staff   285B Nov 29 13:14 .ls.awk
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .4
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .3
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .2
-rw-r--r--  1 bbronosky  staff     0B Dec  1 00:25 .1
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 4
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 3
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 2
-rwxr-xr-x  1 bbronosky  staff     0B Dec  1 00:25 1

Moje wdrożenie tego można zobaczyć tutaj https://github.com/RichardBronosky/dotfiles/commit/6170c0a9

Najważniejsze w tym jest to, że jest to struktura do ulepszania twoich lswyników. Możesz zrobić wszystko, co chcesz z tym filtrem awk. Możesz chcieć, aby były to katalogi, następnie pliki dotfiles, a następnie wszystko inne. Gdy już wiesz, jak obsługiwać kolory xterm, nie jest to zbyt trudne. To zależy wyłącznie od Ciebie.

Bruno Bronosky
źródło
-1

Może spróbuj tego w pliku .bashrc lub / etc / bashrc:

LS_OPTIONS='--color=tty -A -F -X -B -h -v -b -T 0 --group-directories-first';
export LS_OPTIONS;
alias ls='/bin/ls $LS_OPTIONS';

Zakłada się, że korzystasz z nieco nowszej wersji ls, która bierze opcję „--group-directories-first” jako opcję. Możesz oczywiście dostosować opcje LS do swoich upodobań.

Phil
źródło
Co --group-directories-firstma wspólnego z „najpierw pokaż pliki kropkowe”?
G-Man mówi „Reinstate Monica”