Lubię móc nazywać pliki i katalogi prefiksem podkreślenia, jeśli chcę coś oddzielić od innych plików i katalogów na tym samym poziomie. Na przykład w systemach Windows i Mac poprzedzenie pliku znakiem podkreślenia sortuje go do góry, przed plikami rozpoczynającymi się od znaku alfanumerycznego.
Okazało się, że Google ma związek z LC_COLLATE i obecnymi ustawieniami narodowymi (en_US). W porządku, choć naprawdę nie rozumiem, dlaczego en_US nie sortuje zgodnie z oczekiwaniami.
Na podstawie ustawień regionalnych strony demonstracyjnej ICate Collate ustawienia en_US_POSIX z pewnością wydają się mieć porządek sortowania, którego szukam (musisz edytować przykładowe dane i dodać podkreślenia, aby je przetestować). Ale tak naprawdę nie widzę, jak zastosować to w mojej powłoce Linux.
Idealnie, chciałbym móc skonfigurować coś w mojej konfiguracji bash, aby zawsze ls najpierw sortował podkreślenia. Jak miałbym to zrobić?
Odpowiedzi:
Jeśli nie możesz
ls
posortować tak, jak chcesz, spróbuj rozszerzenia powłoki.Wzorów nazw plików można używać do uruchamiania
ls
z listą plików, które powłoka już posortowała, z pominięciem używanej metodyls
.Zakładając, że masz pliki
to jest jak bieganie
Wyjaśnienie:
_*
to wzór powłoki pasujący do dowolnej nazwy pliku rozpoczynającej się znakiem podkreślenia, rozwinięty w kolejności alfabetycznej.[!_]*
pasuje do dowolnej nazwy pliku, która nie zaczyna się od podkreślenia, rozwiniętej w kolejności alfabetycznej.-f
mówi,ls
aby nie sortować, ponieważ powłoka już to zrobiła.Więcej informacji: rozszerzenie nazwy pliku bash
Jeśli w bieżącym katalogu znajdują się katalogi, należy uruchomić następującą komendę, aby uniknąć wyświetlania list plików w katalogach:
źródło
_
aby pliki pojawiały się jako pierwsze, to hack specyficzny dla systemu operacyjnego; a uniksowa wersja tego hacka polega na rozpoczęciu nazwy pliku wielką literą: domyślną konwencją uniksową jest używanie tylko małych liter w nazwach plików.00README
.-f
mówi,ls
aby nie przeprowadzać własnego sortowania, więc wyświetla argumenty w kolejności, w jakiej zostały przekazane. Wynik każdego z firmy Shell wieloznaczne ekspansji_*
i[!_]*
jest leksykograficznie uporządkowany wykaz.ls
sortowania (w dwóch grupach: początkowej_
, potem pozostałych), gdy są generowane przez powłokę. Uruchom,echo ls -lf _* [!_]*
aby zobaczyć, co się stanie.-f
Flaga mówils
nie robić żadnych sortowania.Jeśli nie chcesz mieszać małych i wielkich liter, ustaw swój język na
C
, który przyjmuje znaki w kolejności numerycznej._
mieści się między wielkimi i małymi literami.Ustawienia regionalne
LC_MESSAGES
(język komunikatów o błędach),LC_CTYPE
(zestawy znaków) orazLC_TIME
(format daty i godziny) są bardzo przydatne.LC_COLLATE
iLC_NUMERIC
zwykle są bardziej kłopotliwe niż są warte, nie zalecam ich ustawiania. Prawidłowe sortowanie leksykograficzne jest bardziej skomplikowane, niżLC_COLLATE
powinno się to określać, i może powodować różnego rodzaju dziwne zachowania, gdy używasz zakresów znaków w wyrażeniach regularnych.LC_NUMERIC
jest głównie kosmetyczny, z wyjątkiem sytuacji, gdy coś idzie strasznie nie tak, ponieważ jakiś program wygenerował liczbę z separatorem dziesiętnym innym niż.
.źródło
VAR=value cmd
ustawiaVAR
sięvalue
tylko w środowiskucmd
i nie dotyka wartości (lub braku wartości) w powłoce, w której ją uruchamiasz. Aby znak podkreślenia pojawiał się przed dużymi literami, musisz zdefiniować własne ustawienia regionalne. Jest to możliwe, ale niewygodne w użyciu, ponieważ przynajmniej w Linuksie biblioteka standardowa szuka tylko definicji ustawień narodowych/usr/lib/locale
- nie ma~/.locale
zmiennej środowiskowej ani zmiennej, w której można by umieścić swojeen_tom
ustawienie.ls
polecenie, skorzystaj z sugestii Mikela .Niestety, Linux używa glibc do informacji o lokalizacji, a nie do ICU, więc nie ma sposobu, aby zastosować to bezpośrednio do Linuksa, nie poświęcając wiele wysiłku ani na modernizację ICU na glibc, ani na uzupełnienie informacji o locale w glibc.
źródło
Dodanie
-f
przełącznika (bez sortowania) sprawiło, że pokazał mi się w ten sposób.man ls
źródło
touch 3 1 _1 _3 2 _2 && ls -fl
wyniki2 . 1 3 _2 _3 .. _1