Das bessere, schönere „ls“: So behältst du mit Exa deine Dateien & Ordner im Überblick

Als Video ansehen
Bereitgestellt über YouTube

Das bessere, schönere „ls“: So behältst du mit Exa deine Dateien & Ordner im Überblick

Als Einsteiger ist ls wohl eines der ersten Werkzeuge, die man kennen lernt. Exa ist ein mächtigerer Ersatz für ls, der einige nützliche Zusatzfunktionen bietet. Es kann sowohl auf Raspberry Pis, als auch jedem anderen GNU/Linux-System verwendet werden. Dieser Beitrag stellt exa vor, zeigt die Installation und Anwendung im Alltag – inklusive eigenen Aliasen, um es mit wenigen, kurzen Befehlen aufrufen zu können.

Welche Vorteile bietet exa gegenüber dem altbewährten ls?

Die GNU coreutils gehören – wie der Name bereits vermuten lässt – zu den grundlegenden Werkzeugen jeder GNU/Linux-Distribution. Sie enthalten eine ganze Reihe bekannter Befehle wie cp zum kopieren, rm löscht Dateien/Ordner sowie auch ls, um den Inhalt eines Verzeichnisses anzuzeigen: Welche Dateien bzw. Ordner befinden sich darin, wie groß sind diese, welche Berechtigungen wurden vergeben usw.

Das GNU ls ist nicht grundlegend schlecht oder kaputt, im Gegenteil: Man kann damit den Inhalt eines Verzeichnisses sehen. In der Hilfe (ls –help) sind zudem ein paar nützliche Optionen, um damit besser arbeiten zu können. Ich nutze beispielsweise meistens die Listansicht (-l) und für uns Menschen besser lesbare Größenangaben (-h für human readable). Spätestens in größeren Verzeichnissen gestaltet -c (color) die Ausgabe angenehmer, da Ordner und Dateien anhand von verschiedenen Eigenschaften (z.B. Archive oder ausführbare Skripte) dadurch in einer eigenen Farbe dargestellt werden:

Exa ist ein quelloffenes Werkzeug, dass hier und bei anderen Funktionen noch weiter geht: Es kennt mehrere Dateitypen und gruppiert diese in verschiedenen Farben. Außerdem nutzt es die Farben an zusätzlichen Stellen, wie etwa den Dateiberechtigungen.

Interessant finde ich dabei auch die integrierte Baum-Ansicht (-T für tree), wenn man die Inhalte von Unterordnern ebenfalls sehen möchte. Das kann ls nicht, hierfür müsste man ansonsten auf das Werkzeug tree zurückgreifen. Doch tree zeigt standardmäßig lediglich Ordner- und Dateinamen ohne weitere Informationen an. Zwar kann man über Parameter zusätzliche Spalten einblenden, das Ergebnis finde ich nicht zufriedenstellend. Außerdem kennt tree weniger gängige Dateitypen, wie ls.

Darüber hinaus bietet exa sinnvollere Standardeinstellungen, wie etwa Größenangaben mit Präfix (K für KB, M für MB usw). Das kann ls zwar auch, aber nur mit dem Schalter -h. Gerade für Einsteiger, die das nicht wissen, eher verwirrend, wenn man (größere) Dateien in Bytes angegeben sieht. Mit –icons können neuere Versionen zusätzlich zu den verschiedenen Farben von Dateitypen auch Symbole anzeigen, wie man sie aus dem grafischen Dateiexplorer kennt. Auch in Git-Repositorys lassen sich durch –git zusätzliche Informationen über den Status von Dateien anzeigen.

So installierst du exa auf dem Raspberry Pi und anderen Debian-Systemen

Es existieren offizielle Pakete für Debian und damit auch das Raspberry Pi OS. Auch eine Reihe weiterer Distributionen werden unterstützt: Fendora, Arch Linux, Gentoo und Ubuntu. Dort könnt ihr die Installation mit dem gleichnamigen Paket über einen einzigen Befehl durchführen. Im Falle von Debian/Ubuntu und anderen davon abstammenden Distributionen:

sudo apt install exa
$ exa --version
exa v0.9.0

Ein Nachteil ist allerdings, dass ihr – zumindest bei konservativeren Distributionen wie Debian – in der Regel eine etwas ältere Version erhaltet. So wird Debian/Raspberry Pi OS 11 Bullseye mit Version 0.9 ausgeliefert. In der bereits seit April 2023 verfügbaren Version 0.10.1 wurde zusätzlich Git integriert sowie mit –icons farbige Symbole, welche die Dateien nochmals besser voneinander abheben.

Für 32 Bit ARM sowie die X86-Architektur stehen Binärdateien in den GitHub-Releases bereit. Wer mit einem 64 Bit Betriebssystem unter ARM die aktuellste Version nutzen möchte, muss den Quellcode selbst kompilieren. Die kompilierte 32 Bit Version ist nämlich gegen entsprechende 32 Bit Bibliotheken gelinkt und daher nicht ohne weiteres lauffähig. In beiden Fällen müssen neue Versionen zudem händisch eingepflegt werden, im Falle des APT-Paketes werden sie dagegen über die zentrale APT-Paketverwaltung aktuell gehalten.

daniel@pi:~ $ ./bin/exa
-bash: ./bin/exa: No such file or directory
daniel@pi:~ $ file ./bin/exa
./bin/exa: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=4fdce3100ba7ed705051623777438ffbaa88a589, stripped
daniel@pi:~ $ file /bin/gzip
/bin/gzip: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=56e21ec05e56424ad63fb692b1108934a5052cf5, for GNU/Linux 3.7.0, stripped
daniel@pi:~ $ uname -a
Linux pi 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023 aarch64 GNU/Linux

Die aktuellste Version kompilieren und installieren

Das Kompilieren gestaltet sich aufwändiger, da zuerst einige Abhängigkeiten installiert werden müssen. Zudem dauert der Vorgang vor allem auf dem Raspberry Pi (4) aufgrund seiner geringen Leistung relativ lange. Ihr müsst zuerst Rust installieren:

sudo apt install curl build-essential gcc make
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o install-rust.sh
# Ihr solltet fremde Skripte immer zuerst mit einem Editor (z.B. nano install-rust.sh) prüfen!
sh install-rust.sh
# Nachdem die Auswahlliste (Option 1,2,3) erscheint, gebt ihr 1 für "Proceed with installation" ein und drückt Enter
source "$HOME/.cargo/env"

Anschließend noch die von exa benötigten Bibliotheken, den Quellcode vom GitHub-Repository laden und mit dem Rust-Werkzeug cargo den Buildprozess starten:

sudo apt install libgit2-dev cmake

git clone https://github.com/ogham/exa.git
cd exa
cargo build --release

Die Binärdatei liegt im Unterpfad target/release. Neben der Version erhält sie den Zusatz +git, woran man erkennen kann, dass dies enthalten ist:

daniel@pi:~/exa-build/exa $ ./target/release/exa --version
exa - list files on the command-line
v0.10.1 [+git]
https://the.exa.website/

Falls ihr exa bereits über das APT-Paket installiert habt, müsst ihr dies zuvor mit apt remove exa entfernen. Da es sich um eine einzelne Binärdatei handelt, würde ich sie in /usr/local/bin verschieben. Da sich dieser Pfad in $PATH befindet, könnt ihr sie nun ohne Pfadangabe aus jedem Verzeichnis heraus aufrufen:

sudo mv target/release/exa /usr/local/bin
exa --version
exa - list files on the command-line
v0.10.1 [+git]
https://the.exa.website/

Bei einer Installation außerhalb der APT-Paketquellen müsst ihr Aktualisierungen händisch einspielen! Ich empfehle daher dringend, so etwas zu dokumentieren und regelmäßig auf neue Versionen zu prüfen.

Exa im Alltag nutzen

Ruft man exa ohne Parameter auf, ähnelt die Ausgabe ls. Die standardmäßige Grid-Ansicht finde ich eher unübersichtlich und nutze daher folgenden Aufruf:

exa -l -F -g -h --icons

-l aktiviert die Listenansicht, -F zur Klassifizierung nach Dateitypen (nachgestellter Schrägstrich bei Ordnern, Sternchen bei ausführbaren Dateien, @ für symbolische Links usw), -g zeigt neben des Eigentümer-Benutzers zusätzlich die Gruppe an, -h aktiviert die Kopfzeile zur Beschriftung und –icons sorgt für farbige Symbole vor den Dateinamen, die zum Typ passen. So erkennt man beispielsweise Skripte auf den ersten Blick. Damit die Icons funktionieren, benötigt ihr eine Schrift, welche diese unterstützt. Aus meiner früheren Erfahrung ist das vor allem unter Windows oft nicht der Fall. Ebenfalls nützlich ist die Gruppierung von Ordnern, dies funktioniert mit ls und exa durch den –group-directories-first Parameter. Dann

Anfangs hatte ich die praktische Möglichkeit der Baumansicht angesprochen, die lässt sich mit -T (tree) aktivieren. Hier macht es jedoch Sinn, zusätzlich die Tiefe zu begrenzen – vor allem in tiefen Verzeichnisbäumen wird die Ausgabe ansonsten sehr lang und damit wiederum unübersichtlich. Mit -L 2 begrenze ich die Tiefe auf zwei Ebenen. Der Ordner, dessen Inhalt exa auflistet, ist dabei die erste Ebene. Somit erhalten wir die Inhalte von darin befindlichen Unterordnern, aber keine Unterordner von Unterordnern.

exa -T -l -F -g -h --icons -L 2

Nun bringt exa zwar sinnvollere Standard-Einstellungen mit, einiges ist jedoch trotzdem nicht aktiviert. Diesen Befehl mit den zig Parametern möchte natürlich keiner jedes mal eintippen, um den Verzeichnisinhalt zu sehen. Bewährt haben sich die Kürzel l und ll, die von manchen Distributionen als Alias für ls gesetzt werden, um z.B. -c für die farbige Ausgabe zu aktivieren. Dazu öffnet ihr die ~/.bash_aliases mit einem Texteditor eurer Wahl (z.B. vim/nano – im Zweifel nano nehmen)

vim ~/.bash_aliases

fügt folgende beiden Zeilen ein, um die Aliase l und ll anzulegen:

alias l="exa -l -F -g -h --icons --group-directories-first"
alias ll="l -T -L 2"

Anschließend die .bashrc (darin lädt Debian standardmäßig die .bash_aliases automatisch) neu laden:

source ~/.bashrc

Nun könnt ihr l für die einfache Ansicht ohne Unterverzeichnisse nutzen, also vergleichbar mit ls. Möchtet ihr Unterordner ebenfalls anzeigen, erledigt dies ll bis zur zweiten Ebene. Natürlich lässt sich das auch bei Bedarf anpassen, etwa ll -L 3 für eine Ebene mehr.

Die Git-Integration

Innerhalb eines Git-Repos kann man mit -l –git eine zusätzliche Spalte einblenden. Da ich den zuvor angelegten Alias verwende, genügt –git zur Aktivierung. Testweise habe ich ein leeres Git-Repository angelegt und die Dateien test sowie test2 in einem Commit zur Versionsverwaltung hinzugefügt. Anschließend wurde test2 verändert sowie test3 neu hinzugefügt, ohne diese Änderungen mit einem weiteren Commit aufzunehmen. Somit zeigt git status, dass test2 neue Änderungen aufweist und test3 noch überhaupt nicht verfolgt wird. Mit l –git aktiviert ihr die Git-Integration von Exa und erhaltet eine neue Spalte. Sie gibt uns entsprechend M für modifiziert und N für neu (new) aus. Bei test hingegen nichts, da sie mit allen Änderungen versioniert ist.

Sie zeigt derzeit im ersten Zeichen, ob eine Datei Änderungen enthält, die bereits gestaged wurden, aber noch in keinem Commit enthalten sind. Das Zweite Zeichen zeigt Anpassungen, die nicht gestaged sind. Sie können jeweils (N) für neue oder veränderte (M für modified) Dateien annehmen. Falls nicht zutreffend, steht in einem oder beiden ein Minus. Hierfür muss übrigens Git nicht installiert sein, da diese Funktion mit einer Bibliothek abgebildet wird. Wobei es viele Distributionen ohnehin bereits vorinstalliert haben.

Die Git-Integration ist standardmäßig nicht aktiviert, da das Prüfen des Git-Status etwas Leistung kostet. Gerade bei größeren Verzeichnissen wird es dadurch etwas langsamer. Je nachdem womit ihr arbeitet, könnt ihr sie über den Alias auch dauerhaft aktivieren.

Fazit: Exa ist das bessere und schönere ls

Exa hat ls um ein paar nützliche Funktionen ergänzt. Die Darstellung wird durch die Farben übersichtlicher und zudem optisch ansprechender. Leider fehlt der zur Zeit in Debian 12 enthaltenen Version die Git-Integration sowie Symbol-Anzeige vor den Dateinamen. Unter vielen Architekturen lässt sich das mit den bereitgestellten Binärdateien recht einfach händisch lösen. Hat man die 64 Bit Edition des Raspberry Pi OS installiert, bleibt nur selbst kompilieren. Dies braucht vor allem auf dem RPI seine Zeit, funktioniert mit Mehraufwand ebenfalls.

Wer möchte, kann exa über Umgebungsvariablen noch tiefergehender anpassen. Beispielsweise durch benutzerdefinierte Farben, auch für eigene/exotische Änderungen, die das Kommandozeilenwerkzeug noch nicht erkennt. Bei mir gehört es mittlerweile zu den Standard-Werkzeugen unter GNU/Linux-System, ob X86 Server oder Raspberry Pi.

Leave a Reply