Sortowanie ls bez rozróżniania wielkości liter w Mac OSX

30

Jak mogę sprawić, by lspolecenie w Max OS X Lion sortowało pliki i katalogi podobnie jak Ubuntu Linux (bez uwzględniania wielkości liter, katalogów NIE na górze, plików kropek NIE na górze)? Idealnie chciałbym to zrobić bez przesyłania danych wyjściowych do innego polecenia, takiego jak sort.

Na przykład chcę zobaczyć:

foo
Foobar
MyStuff/
.stuff/
test.txt

zamiast:

.stuff
Foobar
MyStuff/
foo
test.txt

W systemie Linux lskolejność sortowania jest kontrolowana w szczególności przez ustawienia regionalne systemu LC_COLLATE. Kiedy LC_COLLATE=en_US.UTF-8ls posortuje elementy tak, jak chcę. Kiedy LC_COLLATE=C, lsposortuje podobnie jak OS X.

LC_COLLATEjest ustawiony na en_US.UTF-8OS X, ale lsnadal sortuje stary POSIXsposób. Czy ktoś wie, jak mogę sprawić, aby działał bardziej jak Linux?

Emil
źródło
Jeśli to pomaga: apple.stackexchange.com/a/22304/8546 zauważa, że ​​HFS Plus jest zwykle skonfigurowany tak, aby nie rozróżniał wielkości liter, ale zachowuje wielkość liter .
Graham Perrin

Odpowiedzi:

16

To może nie być możliwe:

Patrząc na kod źródłowy dla ls , używa on strcoll do sortowania nazw plików, dlatego powinien przestrzegać LC_COLLATE.

Niektóre posty online sugerują, że ustawienia narodowe w BSD (i Darwin / OS X) są nieco zepsute w porównaniu do tych w Linuksie. Napisałem własny program do szybkiego sortowania, który wyraźnie ustawił jego ustawienia regionalne i przetestowałem go przy użyciu ustawień regionalnych en_US.UTF-8 i C na moim komputerze (Mac OS 10.6.3) i na komputerze uniwersyteckim (Linux, FC11?). Podczas gdy sortowanie działa zgodnie z oczekiwaniami na maszynie linuksowej („a B c” vs „B a c”), mac zawsze sortuje je jako „B a c”.

Źródło: http://ask.metafilter.com/130292/CaseInsensitive-LS-on-Mac-OS-X

ORYGINALNA ODPOWIEDŹ

To polecenie nie sortuje plików kropek, ale wyświetla dodatkowe listy katalogów

ls -f1 

Zbliżyłem się do tego:

.
..
.stuff
foo
Foobar
MyStuff
test.txt
Sairam
źródło
1
Ciekawe, że „wyłączenie sortowania” z opcją -f wydaje się sortować zgodnie z oczekiwaniami. Zakładam, że jest to sortowanie wpisów w systemie plików / HFS + z bardziej „naturalnym” zestawieniem.
Gerry
6

Wiem, że udzielono odpowiedzi, ale dla mnie to działa najlepiej:

ls -f1 -alF -G

Wyświetla wszystkie szczegóły i sortuje je, ignorując wielkość liter.

Jared Burrows
źródło
4

Przez jakiś czas mnie to denerwowało i wreszcie udało mi się to uporządkować (heh). Po wypróbowaniu kilku sugestii, które nie zadziałały, oto, co zadziałało.

Jeśli chcesz zainstalować MacPorts (lub Homebrew lub Fink), wersja ls GNU robi dokładnie to, co chcesz. Sam używam MacPorts, więc to podejście wyjaśnię:

  1. Pobierz i zainstaluj MacPorts:

    http://www.macports.org

  2. Zainstaluj pakiet GNU Coreutils:

    sudo port install coreutils

  3. Powinieneś mieć teraz ls GNU: gls. Wypróbuj w katalogu, który zawiera elementy zaczynające się zarówno dużymi, jak i małymi literami:

    gls -U

    (Ta -Uopcja w rzeczywistości oznacza „nieposortowane”, ale w systemie OS X ma to pożądany wpływ na to, aby rozróżniała wielkość liter).

  4. Dodaj ten alias do swojego, .bash_profileaby zwykły lsdziałał tak, jak chcesz (podoba mi się kolor, ale możesz to pominąć, jeśli chcesz; potrzebujesz tylko -U):

    alias ls='gls -U --color'

Pamiętaj, że ta -Uopcja prawdopodobnie nie będzie działać na innych platformach. W OS X zawsze wydaje się, że robi to dobrze (być może dlatego, że HFS + skutecznie rozróżnia małe i wielkie litery - technicznie „rozpoznaje małe i małe litery”), ale jeśli spróbujesz na Linuksie, wyniki najprawdopodobniej po prostu nie będą w ogóle posortowane.

Jason Sims
źródło
1
3. wydaje się, że nie ma już pożądanego efektu ubocznego (opcja -U) pod macOS> = 10,13 ze względu na nowy APFS.
Marius Hofert
1
Tak… nie wygląda na to, aby można to zrobić za pomocą APFS.
Jason Sims
Potwierdź działa jednak 10.12. Dzięki!
Pułkownik Panic
4

Dodając do tego, co napisał Mike powyżej, posunąłem się nieco dalej i znalazłem sposób na zdefiniowanie własnych reguł zestawiania.

Definicje ustawień regionalnych znajdują się w / usr / share / locale /. Każdy folder jest ustawieniem regionalnym i ma plik (lub link) LC_COLLATE, który określa, które symbole są „takie same” (na przykład, że U, u i ü należy brać pod uwagę przy zamawianiu). Możesz zduplikować katalog, a to utworzy nową definicję ustawień regionalnych:

$ sudo cp -R en_GB.UTF-8/ en_GB.UTF-8-CI/

Teraz będziesz mieć nowe ustawienia narodowe o nazwie „en_GB.UTF-8-CI” („CI” dla bez rozróżniania wielkości liter) i możesz z niego korzystać LC_COLLATE.

Teraz, aby zmienić LC_COLLATE w nowym języku, możesz pobrać źródła ustawień regionalnych z http://www.opensource.apple.com/source/adv_cmds/adv_cmds-119/usr-share-locale.tproj/colldef/ , edytuj ten to najbliżej tego, co chcesz i uruchom

$ colldef < <new collation file>
$ sudo cp LC_COLLATE /usr/share/locale/en_GB.UTF-8-CI/

a teraz kiedy biegniesz

$ LC_COLLATE=en_GB.UTF-8-CI ls

będziesz miał sortowanie zgodnie z własnymi zasadami.

Tak, właśnie to powoduje, że wielkość liter „ls” nie uwzględnia wielkości liter.

Dmitry
źródło
2

Aby obejść ten problem, możesz użyć funkcji i aliasu:

function lssorted() { /bin/ls "$@" | sort -f ;}
alias ls='lssorted'

Powoduje to, że wynik standardowego polecenia ls jest sortowany bez rozróżniania wielkości liter.

Arne
źródło
1
Muszę zauważyć: to się nie powiedzie, jeśli użyjemy na przykład -l. Następnie ls tworzy na początku kolejną linię „total X”, która również zostanie posortowana.
Arne,
2

Za pomocą

ls -f

pracuje dla mnie.

-f oficjalnie wyłącza sortowanie, ale wygląda na to, że świeci oryginalny sort HFS, który jest dokładnie bez rozróżniania wielkości liter.

Wydaje mi się, że tak naprawdę zależy to od tego, czy w formacie HD rozróżniana jest wielkość liter, czy nie, ale ponieważ format HFS z rozróżnianiem wielkości liter jest domyślny dla dysków systemowych Mac OS X, to powinno działać dla większości użytkowników.

Jpsy
źródło
To zdecydowanie właściwa odpowiedź. Jedynym problemem jest to, że domyślnie włącza również -a, i nie ma sposobu, aby to wyłączyć, co pokaże pliki / foldery zaczynające się od kropki, w tym. i .. .
lensovet
1
Innym problemem (teraz) jest to, że wydaje się, że to już nie działa w macOS> = 10,13 z powodu nowego APFS.
Marius Hofert
1

Zainspirowany odpowiedzią Mike'a, dodałem następujące polecenie do / etc / bashrc i działa to pięknie w Mojave. Wyświetla listę ukrytych plików na końcu, gdy dodaje się -a, ale to mi nie przeszkadza.

export LC_COLLATE="cs_CZ.ISO8859-2"; alias ls='ls -lhFG'

Możesz zobaczyć nową konfigurację, uruchamiając polecenie locale. Aby przywrócić, wystarczy usunąć linię z / etc / bashrc i zalogować się ponownie do terminala.

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="cs_CZ.ISO8859-2"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

Zauważ, że ani ls -f1, ani ls -f nie działały dla mnie w Mojave. Skończyłem z naprawdę nieposortowaną listą. Tylko rozwiązanie, które podałem, działało dla mnie w Mojave.

Jer
źródło
Najlepsza odpowiedź, ale podany przykład robi za dużo. Powinien zostać skrócony do: wstaw następujący wiersz do swojego .bashrclub .zshrc:alias ls="LC_COLLATE=cs_CZ.ISO8859-2 ls"
user1561489
0

Biegać:

$ type ls

Prawdopodobnie przekonasz się, że twoje lspolecenie jest pseudonimem.

MikeyB
źródło
W systemie Linux: ls is /bin/ls. Na OS X: ls is hashed (/bin/ls). Tak czy inaczej, nawet jeśli zadzwonię /bin/lsbezpośrednio, nadal nie będzie sortować według LC_COLLATE.
2
To zaskakujące, postawiłbym na założenie, że wasze lsdowództwo zostało pseudonimem --group-directories-first. Nadal można to zrobić gdzie indziej, ale nie jako alias.
MikeyB,
0

Jeśli zajmujesz się głównie porządkiem sortowania plików kropek, możesz sortować według rozszerzenia : użyj lspolecenia z GNU Fileutils z opcją --sort=extension. (Możesz zainstalować GNU Fileutils np. Poprzez Macports.)

halloleo
źródło
0

ls sortuje według LC_COLLATE, po prostu większość wszystkich plików LC_COLLATE jest ustawiona na sortowanie z rozróżnianiem wielkości liter. http://collation-charts.org/fbsd54/

Są dwa ustawione na sortowanie bez rozróżniania wielkości liter: cs_CZ.ISO8859-2 i et_EE.ISO8859-15 et_EE.ISO8859.15 nie sortuje „Z” tak, jak chcieliby tego anglojęzyczni. cs.CZ.ISO8859-15 robi dobrą robotę z alfabetem, chciałbym tylko, żeby sortował „~” przed znakami alfabetycznymi.

Moje rozwiązanie to: LC_COLLATE = cs_CZ.ISO8859-2 / bin / ls -FG

Zastanawiam się, czy można utworzyć niestandardowy plik LC_COLLATE do obsługi „.” tak jak chcesz i „~” tak jak ja chcę.

Mikrofon
źródło