Utwórz następujące pliki w katalogu.
$ touch .a .b a b A B 你好嗎
Moja domyślna ls
kolejność ignoruje obecność wiodących kropek, mieszając je z innymi plikami.
$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
I może zmienić LC_COLLATE
umieścić dotfiles pierwszy.
$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Niestety powoduje to, że w kolejności sortowania rozróżniana jest wielkość liter, tzn. A
I B
poprzedzają a
i b
. Czy istnieje sposób, aby najpierw wydrukować pliki kropkowe bez rozróżniania wielkości liter ( A
i a
poprzedzać B
i b
)?
Edycja: próba modyfikacji LC_COLLATE
Żadna z dotychczasowych odpowiedzi nie w pełni powiela funkcjonalność ls
łatwego. Możliwe, że mógłbym zawinąć niektóre z nich w funkcję, ale musiałoby to zawierać szczegółowy kod dotyczący (np.) Pracy bez argumentu w porównaniu z podaniem katalogu jako argumentu. Lub jak radzić sobie z wyraźną -d
flagą.
Alternatywnie myślałem, że może być lepszy LC_COLLATE
w użyciu. Jednak nie wydaje mi się, żeby to działało. Obecnie używam LC_COLLATE="en_AU.UTF-8"
. Sprawdziłem /usr/share/i18n/locales/en_AU
(chociaż nie jestem pewien, czy jest to właściwy plik, ponieważ nie widzę żadnych odniesień do UTF-8
); Znalazłem następujące.
LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE
/usr/share/i18n/locales/iso14651_t1
zawiera copy "iso14651_t1_common"
. Wreszcie /usr/share/i18n/locales/iso14651_t1_common
zawiera
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
Usunąłem tę linię, uruchomiłem sudo locale-gen
i ponownie uruchomiłem komputer. Niestety nic to nie zmieniło.
$@
.Można użyć porządek powłoce zamiast (która nie może obejmować lokalna sortowania zamówienie;
bash
, AT & Tksh
,yash
,tcsh
izsh
dać oczekiwanych rezultatów,mksh
adash
. Niefish
wydaje się, aby dać wielkość liter ma znaczenie kolejność ale daje różne wyniki, gdy istnieją non-ASCII postacie):Daje
ls
to jawną listę plików (i katalogów) do wyświetlenia, i dezaktywujels
sortowanie (-U
które jest rozszerzeniem GNU).Jest kilka ostrzeżeń, w zależności od używanej powłoki.
zsh
domyślnanomatch
opcja spowoduje polecenia się nie powiedzie, jeśli katalog nie zawiera zarówno ukryte i bez ukrytych plików; możesz wyłączyć,nomatch
aby tego uniknąć, ale lepiej byłobyset -o cshnullglob
zamiast tego zrobić (a polecenie zakończyło się niepowodzeniem tylko wtedy, gdy żadna z globusów nie pasuje jak w(t)csh
powłokach wczesnych lub uniksowych).zsh
,pdksh
jego pochodna ifish
,.*
rozszerzenie nie obejmuje.
i..
, więc to pasujels -Al
. Z innymi powłokami.
i..
są dołączone, więc pasujels -al
. W tym drugim przypadku należy zmienić wzorce globowania, aby wykluczyć.
i..
(ls -dUl -- ..?* .[!.]* *
).fish
,(t)csh
lubzsh
, jeśli którykolwiek z wzorców globowania nie pasuje do niczego,ls
wyświetli komunikat o błędzie; możesz tego uniknąć, ustawiającnullglob
opcję (wbash
lubzsh
przynajmniej), lub przekierowującstderr
na/dev/null
(ls -dUl -- ..?* .[!.]* * 2>/dev/null
). Jeśli używasznullglob
, uważaj na potencjalnie zaskakujące zachowanie, które powoduje (zobacz Shell jedzący znaki `?` ).fish
zachowuje się tak, jakbash
znomatch
tym wyjątkiem, że gdy jest interaktywny, zostanie wyświetlony komunikat ostrzegawczy dla każdego globu, który nie pasuje.(Podziękowania dla Stéphane'a Chazelasa za wszystkie opinie!)
źródło
mksh
idash
na przykład nie będzie sortować bez rozróżniania wielkości liter.-U
(to znaczy nieposortowane) jest rozszerzeniem GNU. Niektóre innels
implementacje, takie jak FreeBSD, mają,-U
ale nie jest to nieposortowana lista.ls
potrzebujesz--
wcześniej,.*
ponieważ implementacja akceptuje opcje po argumentach (chyba, że POSIXLY_CORRECT znajduje się w środowisku)ls
jako argument.[!.]
jest poprawny. Zobacz pubs.opengroup.org/onlinepubs/9699919799/utilities/… . Niektóre (najbardziej?) Powłoki pozwalają^
na używanie jako synonimów!
w negowanych globach klas postaci. W każdym razie wolę.[!.] .??* *
być nieco bardziej zrozumiały niż.[!.]* ..?* *
Możesz po prostu użyć dwóch osobnych
ls
poleceń:W przeciwieństwie do innych dotychczasowych odpowiedzi, to podejście wyświetla najpierw pliki kropek, unikając wpisów
.
i..
, a następnie pozostałych wpisów wls
kolejności alfabetycznej.Odpowiedź @StephenKitt może zostać ulepszona, aby osiągnąć ten sam wynik:
źródło
ls
jako argument. (FWIW Używam zsh, ale przypuszczam, że jest to przydatne dla bash-people).Możesz grać z opcjami polecenia ls . Spróbuj tego:
Gdzie:
źródło
-X
Flaga sortuje przez rozszerzenie od wyprodukowania.
, który jest zupełnie inny. Ponadto pliki są w odwrotnej kolejności alfabetycznej. Ponadto, mimo że pliki kropkowe są pierwsze w moim przykładzie, nie będzie działać we wszystkich przypadkach (npa.b
c.d
.a
.c
.). Ponadto użyłeś-a
zamiast-A
.