Unter Linux stellt der Befehl `fd` eine benutzerfreundlichere Alternative zum traditionellen `find`-Befehl dar. Er zeichnet sich durch eine vereinfachte Syntax, sinnvolle Standardeinstellungen und ein integriertes, durchdachtes Verhalten aus. Im Folgenden werden wir seine Vorzüge und Funktionen genauer unter die Lupe nehmen.
fd versus find: Die Unterschiede im Detail
Der `fd`-Befehl ist nicht als direkter Ersatz für den etablierten `find`-Befehl gedacht, der seit jeher ein fester Bestandteil von Linux ist. Vielmehr zielt `fd` darauf ab, die häufigsten Anwendungsfälle von `find` auf eine unkompliziertere Art und Weise zu bewältigen. Dabei erweist sich `fd` oft als um ein Vielfaches schneller als `find`, was in den Benchmarks auf der GitHub-Projektseite nachvollzogen werden kann.
Ein wesentliches Merkmal von `fd` ist die farbige Ausgabe, die an die Darstellung einiger `ls`-Modi erinnert. Standardmäßig arbeitet `fd` rekursiv, durchsucht jedoch keine versteckten Verzeichnisse. Weiterhin ist `fd` in der Lage, Git-Repositories zu erkennen und ignoriert automatisch alle Muster, die in `.gitignore`-Dateien festgelegt sind.
Standardmäßig unterscheidet `fd` zwischen Groß- und Kleinschreibung. Sobald jedoch ein Großbuchstabe im Suchmuster verwendet wird, wechselt `fd` in einen Modus, der die Groß- und Kleinschreibung berücksichtigt. Diese Standardeinstellungen sind in vielen Fällen sehr praktisch, können aber natürlich auch durch eigene Anpassungen überschrieben werden.
Installation von fd
Ab Ubuntu 19.04 (Disco Dingo) kann `fd` direkt über das offiziell gepflegte Paket mittels `apt-get` installiert werden. Nutzer älterer Ubuntu-Versionen finden die Installationsanweisungen auf der GitHub-Seite des Projekts.
Der Installationsbefehl lautet:
sudo apt-get install fd-find
Unter Ubuntu wird der Befehl als `fdfind` geführt, um Konflikte mit anderen bereits existierenden Programmen zu vermeiden. Wer jedoch den Befehl lieber unter dem Namen `fd` verwenden möchte, kann einen Alias setzen:
alias fd=fdfind
Um diesen Alias dauerhaft zu speichern und auch nach einem Neustart nutzen zu können, ist es empfehlenswert, ihn in die Datei `.bashrc` oder `.bash_aliases` einzufügen.
Für die Installation unter Fedora lautet der Befehl:
sudo dfn install fd-find
Und unter Manjaro wird `fd` mit folgendem Befehl installiert:
sudo pacman -Syu fd
fd und fdfind: Ein und dasselbe
Um jegliche Verwirrung zu vermeiden, wird in den folgenden Beispielen der Befehl auf einem Ubuntu-Testsystem unter seinem Standardnamen `fdfind` verwendet. Es ist jedoch wichtig zu betonen, dass `fd` und `fdfind` im Grunde identisch sind. Dies wird deutlich, wenn man die Versionsinformation von `fdfind` aufruft, die sich selbst als „fd“ bezeichnet:
fdfind --version
In den folgenden Beispielen verwenden wir den Namen `fdfind`, während Sie auf anderen Linux-Distributionen meist `fd` anstelle von `fdfind` verwenden können, um ein paar Tastenanschläge zu sparen.
Grundlegende Suche mit fd
Ohne zusätzliche Befehlszeilenoptionen verhält sich `fd` ähnlich wie `ls`, listet jedoch standardmäßig auch Dateien in Unterverzeichnissen auf.
Ein einfacher Aufruf von `fdfind` sieht wie folgt aus:
fdfind
Die Ausgabe wird farblich hervorgehoben und unterscheidet so zwischen Dateitypen und Verzeichnissen.
Um nach Dateien eines bestimmten Typs zu suchen, dient die Option `-e` (für Erweiterung). Dabei ist es nicht nötig, der Dateiendung einen Punkt voranzustellen, und auch die Groß- und Kleinschreibung wird nicht beachtet.
Um beispielsweise alle PNG-Bilddateien zu finden, lautet der Befehl:
fdfind -e png
In der Ausgabe werden nun ausschließlich PNG-Bilddateien aufgelistet.
Die Suche nach einer bestimmten Datei erfolgt, indem der Dateiname direkt in der Befehlszeile angegeben wird:
fdfind index.page
Die Datei wird gefunden, auch wenn sie sich in einem Unterverzeichnis befindet. Eine explizite Anweisung zur rekursiven Suche ist nicht notwendig.
Um die Suche in einem bestimmten Verzeichnis zu starten, wird der Pfad des Verzeichnisses in der Befehlszeile angegeben. Der folgende Befehl startet die Suche im Verzeichnis `/etc` nach Dateien, die „passwd“ im Dateinamen enthalten:
fdfind passwd /etc
Dieses Beispiel sucht nach allen C-Quelldateien, die „coord“ im Dateinamen enthalten:
fdfind -e c coord
In diesem Fall wurden zwei passende Dateien gefunden.
fd und Git
Git ist ein weit verbreitetes System zur Quellcode-Versionskontrolle. Wenn Git auf dem System verwendet wird, kommen höchstwahrscheinlich `.gitignore`-Dateien zum Einsatz, um Git mitzuteilen, welche Dateien beachtet und welche ignoriert werden sollen. Standardmäßig berücksichtigt `fd` die Einstellungen in den `.gitignore`-Dateien.
In diesem Verzeichnis existiert ein Git-Repository und die Datei `.gitignore`. Der Befehl:
ls -adl .git*
listet die entsprechenden Dateien und Verzeichnisse auf.
Nun soll `fd` alle Dateien auflisten, deren Dateinamen „coord“ enthalten. Anschließend wird die gleiche Suche mit der Option `-I` (nicht ignorieren) wiederholt. Diese Option veranlasst `fd`, die Einstellungen in `.gitignore` zu ignorieren und jede gefundene Datei zu melden.
Die entsprechenden Befehle lauten:
fdfind coord
fdfind coord -I
Die beiden zusätzlichen Dateien im zweiten Ergebnis sind Objektdateien, die beim Kompilieren eines Programms entstehen und anschließend vom Linker verwendet werden, um die endgültige ausführbare Programmversion zu erstellen.
Objektdateien werden üblicherweise von Programmen zur Quellcode-Versionskontrolle ignoriert, da sie bei jeder Kompilierung neu generiert werden und daher keine separate Speicherung erfordern. Ein Eintrag in der Datei `.gitignore` weist Git an, Objektdateien zu ignorieren, und `fd` folgt dieser Anweisung standardmäßig.
Die Option `-I` (nicht ignorieren) zwingt `fd` dazu, alle gefundenen Dateien auszugeben, ohne sich an der Datei `.gitignore` zu orientieren.
Dateitypen und Groß-/Kleinschreibung
Mit `fd` können gezielt nach Verzeichnissen, Dateien (einschließlich ausführbarer und leerer Dateien) und symbolischen Links gesucht werden. Dies geschieht über die Option `-t` (Typ) gefolgt von einem der folgenden Buchstaben:
f: Datei.
d: Verzeichnis.
l: Symbolischer Link.
x: Ausführbare Datei.
e: Leere Datei.
Der folgende Befehl sucht nach einem Verzeichnis namens `images`:
fdfind -td images
Es wird ein Verzeichnis gefunden, das sich unterhalb des aktuellen Verzeichnisses befindet.
Die Auswirkungen der Groß- und Kleinschreibung auf die Suchmuster lassen sich wie folgt demonstrieren: Zuerst wird nach Dateien gesucht, die „geo“ im Dateinamen enthalten, dann nach Dateien mit „Geo“ im Dateinamen:
fdfind -tf geo
fdfind -tf Geo
Im ersten Befehl wird ein Suchmuster in Kleinbuchstaben verwendet, was `fd` dazu veranlasst, die Groß-/Kleinschreibung nicht zu berücksichtigen. Folglich sind sowohl „geo“ als auch „Geo“ gültige Übereinstimmungen.
Der zweite Befehl hingegen enthält einen Großbuchstaben, wodurch `fd` auf die Groß-/Kleinschreibung achtet und nur „Geo“ als gültige Übereinstimmung akzeptiert.
Befehlsausführung
Der Befehl `fd` kann einen anderen Befehl starten und diesen für jede gefundene Datei ausführen.
Angenommen, es existiert eine Zip-Datei irgendwo in der Verzeichnisstruktur des Quellcodes. Diese kann durch den folgenden Befehl gefunden werden:
fdfinf -e zip
Mit der Option `-x` (exec) kann jede gefundene Datei an einen anderen Befehl zur Verarbeitung übergeben werden. Beispielsweise kann der Befehl:
fdfind -e zip -x unzip {}
das unzip-Dienstprogramm verwenden, um die gefundene Zip-Datei zu entpacken (das `{}` ist ein Platzhalter für die gefundene Datei).
Dadurch wird die Datei im aktuellen Arbeitsverzeichnis entpackt. Soll sie jedoch in das Verzeichnis entpackt werden, in dem sich die ZIP-Datei befindet, sind folgende Platzhalter verfügbar:
{}: Der vollständige Dateipfad und der Name der gefundenen Datei.
{/}: Der Dateiname der gefundenen Datei.
{//}: Das Verzeichnis, das die gefundene Datei enthält.
{/.}: Der Dateiname der gefundenen Datei ohne Erweiterung.
Damit die ZIP-Datei in dem Verzeichnis entpackt wird, in dem sie sich befindet, wird die Option `unzip -d` (Verzeichnis) verwendet und der Platzhalter für das übergeordnete Verzeichnis (`{//}`) übergeben:
fdfind -e zip -x unzip {} -d {//}
Die ZIP-Datei wird daraufhin in dem übergeordneten Verzeichnis lokalisiert und entpackt.
Die erste Wahl für die Dateisuche?
Da `fd` die häufigsten Suchanforderungen so mühelos abdeckt, könnte er sich schnell zur bevorzugten Methode für die Dateisuche entwickeln. Für spezifischere und komplexere Aufgaben steht der bewährte `find`-Befehl weiterhin als verlässliche Alternative zur Verfügung.