Duplikate mit fdupes finden

Wer im Terminal unter macOS Duplikate finden möchte, kann hierfür auf fdupes zurückgreifen. Nach der Installation mittels:

brew install fdupes

kann das Werkzeug im geünschten Ordner genutzt werden:

fdupes -r .

In diesem Fall wird der aktuelle Ordner rekursiv nach Duplikaten durchsucht. Anschließend werden diese Duplikate dargestellt:

./FolderA/file-01.bin
./FolderB/file-01.bin

./FolderA/file-02.bin
./FolderB/file-02.bin

./FolderA/file-03.bin
./FolderB/file-03.bin

Bei dieser Operation werden keinerlei Dateien gelöscht. Dazu bietet fdupes unter anderem einen interaktiven Modus an:

fupes -r -d .

Nach der Ermittlung der Duplikate kann anschließend die Auswahl getroffen werden, welche Dateien nicht gelöscht werden sollen:

Set 17 of 108:

[ ] ./FolderA/file-17.bin
[ ] ./FolderB/file-17.bin

( Preserve files [1 - 2, all, help] )= 1

Ist der interaktive Modus nicht gewünscht, so kann die Löschung auch automatisiert werden. Das Kommando:

fdupes -r -d -N .

behält immer automatisch die erste Datei und löscht alle anderen Duplikate. Damit eignet sich fdupes besonders gut, um große Dateibestände schnell und effizient von doppelten Dateien zu bereinigen und dabei wahlweise die volle Kontrolle zu behalten oder den Vorgang vollständig zu automatisieren.

Häufigkeit der Dateiendungen in einem Verzeichnis analysieren

Gerade bei größeren Projekten oder gewachsenen Verzeichnisstrukturen stellt sich manchmal die Frage, welche Dateitypen in dem Verzeichnis enthalten sind. Im Terminal lässt sich diese Frage mit dem Befehl:

find . -type f | awk -F. 'NF>1 {print $NF}' | sort | uniq -c | sort -nr

beantworten. Als Ergebnis erhält der Nutzer eine Liste mit der Häufigkeit und den Änderungen:

478 toml
380 txt
141 lua
56 ini

Zu Berücksichtigen ist das Dateien ohne Endung vollständig ignoriert werden, bei Dateinamen mit mehreren Punkten (z. B. backup.tar.gz) wird ausschließlich die letzte Endung berücksichtigt und zudem erfolgt keine Vereinheitlichung der Groß- und Kleinschreibung, sodass beispielsweise JPG und jpg als unterschiedliche Endungen behandelt werden.

Gelöschte Dateien im Git-Log finden

Ab und an kommt es vor, dass eine Datei in einem Git-Projekt verschwunden ist. Besonders in größeren Repositorys oder bei längerer Historie stellt sich dann die Frage, wann wurde sie gelöscht und von wem?

Mit folgendem Befehl lassen sich gezielt alle Löschungen in der Git-Historie anzeigen:

git log --diff-filter=D --name-only

In der Ausgabe sind dann die einzelnen Commits, mit entsprechenden Löschungen zu sehen:

commit e14e40f43551902b1934635a9af6674d329df440
Author: seeseekey <>
Date:   Sun Dec 21 19:37:19 2025 +0100

    Remove set item command.

src/main/java/org/example/commands/SetCommand.java

commit 879fbec47cdaf7e788d2b78e385e89db65acb81d36
Author: seeseekey <>
Date:   Fri Nov 28 19:55:22 2025 +0100

    Restructure City generator.

src/main/java/org/example/commands/CityCommand.java

Damit lässt sich auf einen Blick nachvollziehen, wann, von wem und welche Dateien im Repository gelöscht wurden.

Ollama unter Ubuntu 24.04 installieren

Ollama, ein Werkzeug um Large Language Models lokal auszuführen, kann auch auf einem Server z. B. unter Ubuntu 24.04 genutzt werden. Zur Installation wird das Installationsskript auf dem Server ausgeführt:

curl -fsSL https://ollama.com/install.sh | sh

Dieses Skript legt einen Nutzer ollama auf dem System an und installiert Ollama:

curl -fsSL https://ollama.com/install.sh | sh
>>> Installing ollama to /usr/local
>>> Downloading ollama-linux-amd64.tar.zst
######################################################################## 100.0%
>>> Creating ollama user...
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.

Anschließend kann Ollama über das Kommando ollama gesteuert werden. Ein erstes Modell könnte mittels:

ollama run gpt-oss

heruntergeladen und ausgeführt werden. Soll das Modell wieder gestoppt werden, so kann der Befehl:

ollama stop gpt-oss

genutzt werden. Soll ein Modell nur heruntergeladen werden, kann hierfür das Subkommando pull genutzt werden:

ollama pull gpt-oss

Die Daten von Ollama werden im Ordner /usr/share/ollama/ gespeichert. Dort finden sich auch die Modelle im Unterordner .ollama/models. Wer die aktuell laufenden Modelle sehen möchte, kann dies mit dem Befehl:

ollama ps

bewerkstelligen. Das Kommando:

ollama list

hingegen listet alle installierten Modelle auf. Ollama selbst stellt unter 127.0.0.1:11434 eine API bereit, die bei einem sinnvoll konfigurierten Server allerdings nicht von außen erreichbar sein sollte.

Wer diese API von außen erreichbar machen möchte, kann Nginx als Reverse Proxy nutzen. Dazu muss die Datei /etc/systemd/system/ollama.service angepasst und dort kann das Interface auf welchen gehört werden soll, sowie die erlaubten Origins konfiguriert werden:

Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=*"

Danach muss die SystemdUnit neu gestartet werden:

systemctl daemon-reexec
systemctl daemon-reload
systemctl restart ollama

Anschließend kann die eigentliche Nginx-Konfiguration erstellt werden:

map $http_authorization $allow_ollama {
  default 0;
  "Bearer secret123" 1;
  "Bearer secret345" 1;
}

server {

  server_name api.example.org;

  ...

  # Ollama
  location ^~ /ollama/ {

    # Auth
    if ($allow_ollama = 0) { return 401; }

    # Proxy pass
    proxy_pass http://localhost:11434/;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 60s;  # Upstream TCP connect timeout
    proxy_send_timeout    60s;  # Upstream request send timeout
    proxy_read_timeout    300s; # Upstream response read timeout
    send_timeout          60s;  # Client response send timeout

    # Do not forward the token to the backend
    proxy_set_header Authorization "";
  }
}

In dieser wird eine Map mit Bearern definiert, die der Authentifizierung dienen und die API wird über eine ReverseProxy-Konfiguration nach außen gegeben. Ein Beispiel-Aufruf könnte dann wie folgt aussehen:

curl https://api.example.org/ollama/api/chat \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer secret123" \
  -d '{
    "model": "gpt-oss",
    "messages": [
      { "role": "user", "content": "Schreibe einen Haiku über den Frühling." }
    ],
    "stream": false
  }'

Und schon läutet das Ergebnis den Frühling ein:

Frühling ruft leise,
Bäume wachen, Sonne lacht,
Träume fliegen hoch.

Command not found: compdef

Nach der Installation von Angular unter macOS erschient im Terminal beim Start folgende Meldung:

/dev/fd/12:18: command not found: compdef

Hintergrund ist das bei der Installation von Angular die Konfigurationsdatei .zshrc der Shell angepasst wurde:

# Load Angular CLI autocompletion.
source <(ng completion script)

Um das Problem zu lösen, kann die betreffende Änderung in der Konfigurationsdatei entfernt werden. Alternativ kann die generelle Autovervollständigung vor dem Laden der Angular-Autovervollständigung aktiviert werden:

# Init command-line completion
autoload -Uz compinit
compinit

Anschließend sollte die entsprechende Meldung nicht mehr auftreten.