--group-directories-first opcja dla polecenia „ls”

13

Używam zarówno Ubuntu 16.04, jak i OS X.

alias ll='ls -Flh --group-directories-first'

To jest alias w moim bashrc, ale jakoś --group-directories-firstopcja stała się nielegalna w OS X po aktualizacji mojego basha do Homebrew. Na moim pulpicie Ubuntu nadal mogę korzystać z tej opcji.

W jakiej wersji Bash opcja nie jest obsługiwana? Wersja Bash na moim komputerze z systemem OS X mówiGNU bash, Version 4.4.12(1)-release (x86_64-apple-darwin15.6.0)

Chciałbym --group-directories-firstponownie użyć opcji. Czy jest jakiś sposób na osiągnięcie tego?

IzumiSy
źródło
1
Czy używasz GNU Correutils lslub macOS ls? Próbowałeś już drugiego?
bmike

Odpowiedzi:

12

Zainstalować coreutilsz Homebrew i alias llaby gls -Flh --group-directories-firstzamiast.

  • brew install coreutils instaluje GNU Coreutils , na wypadek, gdyby nie został zainstalowany.
  • Użyj alias ll='gls -Flh --group-directories-first'w .bashrc.
    (Jeśli chcesz użyć tego samego .bashrcpliku w obu systemach operacyjnych, patrz poniżej.)

W Ubuntu lsjest dostarczany przez GNU Coreutils , który Ubuntu zawsze ma. Dlatego lsobsługuje --group-directories-firstw Ubuntu. Prawdopodobnie używałeś wcześniej wersji GNU Coreutils lsna macOS, którą Homebrew instaluje jako, glsale którą można wykorzystać lsna kilka sposobów.

lsjest poleceniem zewnętrznym, a nie wbudowanym w Bash. Używanie innej wersji lub kompilacji Bash nie powinno na to wpływać. Nie jestem pewien, co się stało, kiedy zaktualizowałeś Bash za pomocą Homebrew. Może zaktualizowano też więcej niż Bash; możelszdefiniowano funkcję powłoki lub alias w globalnym pliku konfiguracyjnym, który został zastąpiony; może miałeś dowiązanie symbolicznels, które wskazałoglsi zostało zastąpione; może nadal coś takiego masz, ale twój$PATHsię zmienił. Cokolwiek się stanie, GNU Coreutils lsobsługuje--group-directories-first i przejście na to (jak sądzę sugeruje bmike ) powinno rozwiązać twój problem.

Jeśli z jakiegoś powodu chcesz użyć dokładnie tego samego .bashrcpliku w obu systemach, istnieje kilka możliwych rozwiązań. Możesz utworzyć dowiązanie symboliczne, skrypt opakowujący, funkcję powłoki lub (ponieważ rozszerzenie aliasu Bash nie jest rekurencyjne) alias powłoki dla glsswojego systemu Ubuntu. Ale proponuję zamiast sprawdzania OS który jest używany w .bashrc. Chociaż otrzymasz inny llalias zdefiniowany w każdym systemie, to podejście ma tę zaletę, że jest samo dokumentujące. Twój .bashrcbędzie sensu do Ciebie w ciągu roku lub miesiąca.

if [ "$OSTYPE" == linux-gnu ]; then  # Is this the Ubuntu system?
    alias ll='ls -Flh --group-directories-first'
else
    alias ll='gls -Flh --group-directories-first'
fi

Lub jeśli okaże się, że zwykle wolisz uruchamiać Coreutils ls, nawet jeśli nie używasz llaliasu, możesz utworzyć lsalias, aby gls:

if [ "$OSTYPE" != linux-gnu ]; then  # Is this the macOS system?
    alias ls=gls
fi

alias ll='ls -Flh --group-directories-first'

(Podziękowania dla soroushjp za złapanie błędu we wcześniejszej wersji tego skryptu).

Eliah Kagan
źródło
Postępowałem zgodnie z tą odpowiedzią i użyłem: alias ls = 'gls --color -h --group-directories-first' alias ll = 'ls -al'
user2875289
1
Myślę, że w ostatniej sekcji „Lub jeśli uważasz, że zwykle wolisz uruchamiać ...” , warunek należy zmienić na :,"$OSTYPE" != linux-gnu ponieważ chcesz alias ls to gls, jeśli nie korzystasz z systemu Linux GNU (np. jesteś na komputerze Mac).
soroushjp
1
@soroushjp Dzięki - masz rację. (Naprawiłem to; przepraszam za czekanie!)
Eliah Kagan