find, xargs und jq: Dateien und JSON im Terminal verarbeiten
Kurz: find sucht Dateien nach Kriterien, xargs reicht Ergebnisse an andere Befehle weiter, und jq filtert und formt JSON-Daten direkt im Terminal.
Genauer: Diese drei Werkzeuge ergänzen Pipes (|) zu einer starken Werkzeugkette: Dateien finden, Inhalte weiterverarbeiten und strukturierte Antworten von APIs auswerten.
Im Detail
find
find . -name "*.log" # nach Name
find . -type f -size +100M # Dateien über 100 MB
find . -mtime -1 # in den letzten 24 h geändert
find . -type d -empty # leere Ordner
find . -name "*.tmp" -delete # gefundene löschen (Vorsicht!)
find . -name "*.py" -exec wc -l {} + # Befehl auf jede DateiPrüfe die Ausgabe zuerst ohne -delete. Mit -iname ignoriert man Groß-/Kleinschreibung. Schneller und einfacher gibt es fd (moderne Alternative).
xargs
xargs nimmt Eingabezeilen und macht sie zu Argumenten eines Befehls:
find . -name "*.txt" | xargs grep "Fehler"
find . -name "*.jpg" -print0 | xargs -0 -P4 -I{} convert {} -resize 50% {}.klein.jpg-print0 und -0 verarbeiten Dateinamen mit Leerzeichen sicher, -P4 führt vier Aufträge parallel aus, -I{} setzt das Argument an eine bestimmte Stelle.
jq: JSON verarbeiten
curl -s https://api.example.com/users | jq '.' # schön formatieren
cat daten.json | jq '.[] | {name, mail}' # Felder auswählen
jq '.items[] | select(.preis > 10) | .name' daten.json # filtern
jq -r '.[].name' daten.json # roh (ohne Anführungszeichen)
jq 'length' daten.json # Anzahl. ist das aktuelle Element, [] iteriert über Listen, | verbindet Filter, select() filtert, -r gibt rohen Text aus.
Zusammen
Beispiel: Alle JSON-Dateien im Ordner nach einem Feld durchsuchen:
find . -name "*.json" -print0 | xargs -0 jq -r '.titel'Sichere Skripte immer mit Anführungszeichen um Variablen, teste Befehle an Kopien und nutze --dry-run-Optionen, wo vorhanden. Für große Datenmengen sind spezialisierte Werkzeuge (ripgrep, fd, Datenbanken) schneller.
Siehe auch: grep, sed und awk, Pipes und Umleitungen, curl und wget, Dateien suchen und finden