find -print0 · Globbing · IFS · Nullbytes · Bash
Dateien und Verzeichnisse iterieren
ohne kaputte Leerzeichen-Logik in Bash

Das Iterieren über Dateinamen mit Leerzeichen ist einer der häufigsten Fehler in Shell-Skripten. for f in $(find ...) bricht bei Leerzeichen, Tabs und Newlines in Dateinamen. find -print0 mit Nullbyte-Trennung, korrektes Globbing und read -d '' lösen das Problem ein für allemal – zuverlässig, portabel und ohne Sonderfall-Logik.

15 Min. Lesezeit find -print0 · read -d '' · Globbing · IFS · Nullbytes Bash 3.x · 4.x · 5.x · POSIX-kompatibel

1. Das fundamentale Problem mit Leerzeichen in Dateinamen

Das Iterieren über Dateien in Bash ist eine der häufigsten Aufgaben in Shell-Skripten – und gleichzeitig eine der häufigsten Fehlerquellen. Das klassische Antimuster for f in $(find /dir -name "*.log"); do funktioniert zuverlässig, solange alle Dateinamen keine Leerzeichen, Tabs oder Newlines enthalten. In der Praxis scheitert es aber regelmäßig: Bei einem Dateinamen wie access log.txt werden access und log.txt als zwei separate Elemente behandelt – beide verweisen auf nicht existierende Dateien, und die eigentliche Datei wird nie verarbeitet. Das ist kein Randfall, sondern ein strukturelles Problem im Design aller Skripte, die Dateinamen als Strings behandeln.

Das Leerzeichen-Problem beim Iterieren über Dateien entsteht durch das Zusammenspiel von zwei Bash-Features: Word Splitting und Command Substitution. Wenn Bash $(find ...) auswertet, wird die gesamte Ausgabe als String behandelt. Anschließend teilt Bash diesen String anhand des IFS (Internal Field Separator) in Wörter auf – und IFS enthält standardmäßig Leerzeichen, Tabs und Newlines. Jedes Leerzeichen in einem Dateinamen wird so zum Trennzeichen zwischen zwei vermeintlichen Dateinamen. Das Resultat: Statt eines korrekten Dateinamen-Arrays hat die Schleife eine kaputte Wortliste.

Das Problem wird in der Praxis oft nicht sofort entdeckt, weil auf Entwicklungsmaschinen die Testdaten sorgfältig ohne Leerzeichen benannt sind. Wenn das Skript in die Produktion gelangt und dort auf Dateien von Benutzern, aus Windows-Exports oder aus Cloud-Speichern trifft, bricht es. Manchmal verarbeitet das Skript jahrelang Dateien korrekt, bis ein Benutzer zum ersten Mal eine Datei mit einem Leerzeichen hochlädt. Das ist der Moment, in dem man versteht, warum das sichere Iterieren über Dateien in Bash von Anfang an richtig implementiert werden muss.

2. Word Splitting und IFS — wie Bash Strings teilt

Um das sichere Iterieren über Dateien zu verstehen, muss man verstehen, wie Bash Word Splitting funktioniert. Nach jeder Command Substitution $(...), Parameter Expansion $var (ohne Anführungszeichen) und Arithmetic Expansion teilt Bash das Ergebnis an den Zeichen im IFS auf. Das standardmäßige IFS enthält drei Zeichen: Leerzeichen (0x20), Tab (0x09) und Newline (0x0a). Alle drei gelten als Trennzeichen für Word Splitting. Das bedeutet: Jede Variable, die ohne Anführungszeichen verwendet wird und eines dieser Zeichen enthält, wird aufgeteilt – auch dann, wenn das nicht gewünscht ist.

Die erste Reaktion auf dieses Problem ist oft, IFS zu manipulieren. IFS=$'\n' setzt nur das Newline als Trennzeichen, was Dateinamen mit Leerzeichen und Tabs korrekt behandelt, aber bei Dateinamen mit Newlines versagt. Das Muster IFS=$'\n\t' am Skriptanfang entfernt das Leerzeichen aus dem IFS, was viele Word-Splitting-Probleme löst, aber die tiefere Frage nicht beantwortet: Warum behandelt man Dateinamen überhaupt als Text, wenn Unix-Dateinamen jedes Byte außer / und dem Nullbyte enthalten können? Das Nullbyte ist das einzige Zeichen, das in Unix-Dateinamen nicht vorkommen kann – und genau deshalb ist es das perfekte Trennzeichen für nullbyte-getrennte Dateilisten.

3. find -print0 und Nullbyte-Trennung

Das Flag -print0 von find ist die korrekte Lösung für das sichere Iterieren über Dateien. Statt Dateinamen durch Newlines zu trennen, trennt -print0 sie durch Nullbytes (0x00). Da Nullbytes in Unix-Dateinamen nicht vorkommen können, ist diese Trennung absolut zuverlässig – unabhängig davon, ob Dateinamen Leerzeichen, Tabs, Newlines oder andere Sonderzeichen enthalten. Das Nullbyte als Trennzeichen ist ein Designprinzip, das durch die gesamte Unix-Toolchain zieht: find -print0, xargs -0, read -d '' und die sort -z-Option arbeiten alle mit Nullbyte-Trennung.

Das Standard-Pattern für das Iterieren über Dateien mit find -print0 kombiniert es mit einer while-Schleife, die read -r -d '' nutzt: while IFS= read -r -d '' file; do. Das -d ''-Flag setzt das Datensatz-Trennzeichen auf das leere String, was Bash intern als Nullbyte interpretiert. Das -r-Flag verhindert Backslash-Interpretation. Das IFS= ohne Wert deaktiviert das Trimmen von führenden und abschließenden Whitespace-Zeichen aus dem eingelesenen Wert. Diese drei Flags zusammen ergeben das robusteste Muster für die Datei-Iteration in Bash.


#!/usr/bin/env bash
# safe_iterate.sh — Correct patterns for file iteration in Bash
set -euo pipefail

TARGET_DIR="${1:-.}"

# WRONG: breaks on filenames with spaces, tabs, newlines
# for f in $(find "$TARGET_DIR" -name "*.log"); do
#   process "$f"
# done

# CORRECT: null-byte separated iteration (handles ALL filenames)
echo "--- find -print0 + while read -d '' ---"
while IFS= read -r -d '' file; do
  echo "Processing: '$file'"
  # All operations with "$file" in double quotes are safe
  stat --printf='%n: %s bytes, modified %y\n' "$file"
done < <(find "$TARGET_DIR" -name "*.log" -type f -print0)

# Collect into array first (useful when you need the list multiple times)
declare -a log_files=()
while IFS= read -r -d '' f; do
  log_files+=("$f")
done < <(find "$TARGET_DIR" -name "*.log" -type f -print0)

echo "Found ${#log_files[@]} log files"

# Iterate the array — each element is a complete, properly-quoted filename
for f in "${log_files[@]}"; do
  echo "Array element: '$f'"
done

# CORRECT: Globbing for simple cases (no find needed)
# Glob expansion preserves filename integrity natively
for f in "$TARGET_DIR"/*.log; do
  [[ -f "$f" ]] || continue  # skip if no match (glob returned literal pattern)
  echo "Glob: '$f'"
done

4. read -d '' für nullbyte-getrennte Eingaben

Das read-Builtin mit dem Flag -d '' ist der Schlüssel zur korrekten Verarbeitung von find -print0-Ausgaben. Der Parameter -d DELIM setzt das Trennzeichen, bis zu dem read einliest. Das leere Trennzeichen '' veranlasst Bash, das Nullbyte \0 als Datensatz-Trennzeichen zu verwenden – weil ein leerer String intern als Null-Terminator behandelt wird. Das Ergebnis ist eine Schleife, die exakt einen Dateinamen pro Iteration einliest, egal wie viele Leerzeichen, Tabs oder Newlines dieser Dateiname enthält.

Eine häufige Quelle von Verwirrung: Die Notation while IFS= read -r -d '' file; do ... done < <(find ...) verwendet Process Substitution (<()), nicht eine Pipe. Das ist entscheidend, weil eine echte Pipe find ... | while read die while-Schleife in einer Subshell ausführen würde. Variablen, die in der Schleife gesetzt werden, wären außerhalb nicht sichtbar – ein subtiler und häufig verwirrend erklärter Bash-Bug. Process Substitution umgeht dieses Problem: Die while-Schleife läuft im aktuellen Shell-Kontext, und alle darin gesetzten Variablen und Array-Elemente sind nach der Schleife verfügbar.


#!/usr/bin/env bash
# subshell_trap.sh — Demonstrates why process substitution beats pipes for iteration
set -euo pipefail

TARGET_DIR="${1:-.}"

# WRONG: while loop runs in subshell due to pipe — counter will be 0 after loop!
counter=0
find "$TARGET_DIR" -type f -print0 | while IFS= read -r -d '' f; do
  (( counter++ )) || true
  echo "Pipe: '$f'"
done
echo "Counter after pipe-loop: $counter"  # Always 0 — subshell variable!

# CORRECT: process substitution keeps while in current shell context
counter=0
declare -a found_files=()
while IFS= read -r -d '' f; do
  (( counter++ )) || true
  found_files+=("$f")
done < <(find "$TARGET_DIR" -type f -print0)
echo "Counter after process-substitution-loop: $counter"  # Correct count
echo "Array has ${#found_files[@]} elements"  # Also correct

# Demonstrating with filenames that contain spaces, tabs, and special chars
# Create test files with problematic names to verify correctness
TMPDIR_TEST="$(mktemp -d)"
trap 'rm -rf "$TMPDIR_TEST"' EXIT

touch "${TMPDIR_TEST}/normal.txt"
touch "${TMPDIR_TEST}/file with spaces.txt"
touch "${TMPDIR_TEST}/file	with	tabs.txt"
touch "${TMPDIR_TEST}/file
with
newlines.txt" 2>/dev/null || echo "[INFO] Newlines in filename not supported on this FS"

echo "--- All files found correctly ---"
while IFS= read -r -d '' f; do
  printf 'File: [%s]\n' "$(basename "$f")"
done < <(find "$TMPDIR_TEST" -type f -print0)

5. Globbing als sichere Alternative zu find

Für das Iterieren über Dateien im aktuellen Verzeichnis oder in einem bekannten Verzeichnis ist Globbing die einfachste und sicherste Alternative zu find -print0. Glob-Patterns wie *.log, data_*.csv oder **/*.sh werden von Bash direkt zu einer Liste von Dateinamen expandiert – ohne String-Splitting und ohne Subshell. Jedes Element der Expansion ist ein vollständiger, korrekt behandelter Dateiname. Die for-Schleife über ein Glob-Pattern ist daher immer sicher, solange die Dateinamen korrekt in doppelten Anführungszeichen verwendet werden: for f in /dir/*.log; do cmd "$f"; done.

Der einzige Fallstrick bei Globbing ist das Verhalten, wenn kein Dateiname zum Muster passt: Standardmäßig expandiert Bash das Glob-Pattern zum Literal, also zu *.log als String. Das führt dazu, dass die Schleife einmal mit dem Literal-String *.log ausgeführt wird, der auf keine existierende Datei zeigt. Das korrekte Muster ist daher: Nach dem Glob einen Test hinzufügen [[ -f "$f" ]] || continue, der nicht-existierende Dateien überspringt. Alternativ kann man shopt -s nullglob setzen, das bei keinen Treffern eine leere Expansion liefert statt des Literals – besser, aber weniger portabel als der explizite Test.

6. IFS-Manipulation für kontrolliertes Splitting

Die IFS-Variable steuert, wie Bash Strings in Wörter aufteilt, und ist damit der zentrale Hebel für das sichere Iterieren über Dateien, wenn Nullbyte-Trennung nicht möglich ist. Das Pattern IFS=$'\n' vor einer for-Schleife setzt Newline als einziges Trennzeichen, was Dateinamen mit Leerzeichen korrekt behandelt, aber Dateinamen mit Newlines weiterhin bricht. Das Pattern IFS=$'\n\t' am Skriptanfang entfernt das Leerzeichen komplett aus dem Separator, was viele unbeabsichtigte Word-Splitting-Fälle verhindert und trotzdem zeilenbasierte Ausgaben korrekt trennt.

Die wichtigste Regel beim Umgang mit IFS: Nach einer lokalen Änderung immer wiederherstellen. Ein verbreitetes Muster ist das lokale Setzen innerhalb einer Funktion mit local IFS=$'\n', das die Änderung auf den Funktions-Scope beschränkt und automatisch beim Verlassen wiederhergestellt wird. Das direkte Setzen im Skript-Scope ohne Wiederherstellung ist gefährlich, weil alle nachfolgenden Befehle mit dem veränderten IFS arbeiten – oft mit unerwarteten Ergebnissen. Die Empfehlung: IFS global nur auf $'\n\t' setzen (Leerzeichen entfernen), und alle anderen IFS-Änderungen in Funktionen oder über den read-Inline-Prefix IFS=x read -r var einschränken.

7. mapfile für Arrays aus find-Ausgaben

Das Bash-Builtin mapfile (auch als readarray bekannt) liest zeilenbasierte Eingaben direkt in ein Array, ohne eine explizite while-Schleife zu benötigen. Für das sichere Iterieren über Dateien kombiniert man mapfile mit einer Null-Trennzeichen-Variante: mapfile -d $'\0' -t files < <(find ... -print0). Das Flag -d $'\0' setzt Nullbyte als Zeilentrennzeichen, -t entfernt das Trennzeichen vom Ende jedes Array-Elements. Das Ergebnis ist ein Array mit korrekt behandelten Dateinamen, ohne die Subshell-Problematik einer Pipe-Schleife.

mapfile hat gegenüber der manuellen while read-Schleife einen Vorteil in bestimmten Szenarien: Wenn man die Dateiliste mehrfach benötigt, zum Beispiel für Fortschrittsanzeigen oder für die Übergabe an mehrere Verarbeitungsschritte, ist das Array-Befüllen per mapfile idiomatischer und kürzer. Der Nachteil: mapfile mit -d steht erst ab Bash 4.4 zur Verfügung. Auf macOS mit System-Bash (Bash 3.2) ist diese Variante nicht verfügbar. Für maximale Portabilität bleibt die explizite while IFS= read -r -d '' file; do files+=("$file"); done-Schleife die zuverlässigere Wahl.


#!/usr/bin/env bash
# mapfile_and_glob_examples.sh — mapfile and advanced globbing for file iteration
set -euo pipefail

TARGET_DIR="${1:-.}"

# mapfile with null delimiter (Bash 4.4+)
if [[ "${BASH_VERSINFO[0]}" -ge 4 && "${BASH_VERSINFO[1]}" -ge 4 ]]; then
  declare -a files=()
  mapfile -d $'\0' -t files < <(find "$TARGET_DIR" -type f -name "*.sh" -print0)
  echo "mapfile: found ${#files[@]} shell scripts"
  for f in "${files[@]}"; do
    echo "  $f"
  done
else
  echo "[INFO] mapfile -d requires Bash 4.4+ — using while read fallback"
  declare -a files=()
  while IFS= read -r -d '' f; do
    files+=("$f")
  done < <(find "$TARGET_DIR" -type f -name "*.sh" -print0)
fi

# Advanced globbing with shopt
shopt -s globstar  # Enable ** for recursive globbing
shopt -s nullglob  # Empty array if no match (no literal pattern)
shopt -s dotglob   # Include hidden files (dot-files)

declare -a all_bash_scripts=()
for f in "$TARGET_DIR"/**/*.sh; do
  all_bash_scripts+=("$f")
done
echo "Recursive glob: found ${#all_bash_scripts[@]} .sh files"

# Restore defaults
shopt -u dotglob
shopt -u nullglob

# Find directories only — also safe with null bytes
echo "--- Directories ---"
while IFS= read -r -d '' dir; do
  echo "Dir: '$dir'"
  # Count files in each subdirectory
  file_count=$(find "$dir" -maxdepth 1 -type f -print0 | tr -dc '\0' | wc -c)
  echo "  Files: $file_count"
done < <(find "$TARGET_DIR" -mindepth 1 -maxdepth 2 -type d -print0)

8. Iterationsmuster im Vergleich

Beim Iterieren über Dateien in Bash gibt es viele verschiedene Ansätze, die sich in Korrektheit, Portabilität und Anwendbarkeit stark unterscheiden.

Muster Leerzeichen sicher Newline sicher Portabilität
for f in $(find ...) Nein — bricht! Nein — bricht! Alle Shells
find -print0 | while read -d '' Ja Ja Subshell-Problem!
while read -d '' < <(find -print0) Ja Ja Bash 3.1+
for f in /dir/*.ext (Glob) Ja Ja POSIX sh
mapfile -d $'\0' < <(find -print0) Ja Ja Bash 4.4+

Das wichtigste Ergebnis des Vergleichs: Das häufig gesehene for f in $(find ...)-Muster ist in keiner realen Umgebung sicher und sollte konsequent durch while IFS= read -r -d '' f; do ... done < <(find ... -print0) ersetzt werden. Das Pipe-Muster find ... | while read ist zwar bezüglich Dateinamen korrekt, erzeugt aber ein Subshell-Problem, das das Setzen von Variablen in der Schleife verhindert – eine häufige Fehlerquelle. Process Substitution ist die Lösung für beide Probleme gleichzeitig.

9. xargs -0 für effiziente Batch-Verarbeitung

Wenn die Verarbeitung jeder Datei in einem separaten Prozess geschieht, ist xargs -0 effektiver als eine explizite Bash-Schleife. find ... -print0 | xargs -0 cmd übergibt alle gefundenen Dateien in Batches an cmd, minimiert die Anzahl der Prozesse und ist bei tausenden Dateien erheblich schneller als eine Shell-Schleife mit einem neuen Prozess pro Iteration. Das -0-Flag von xargs liest Nullbyte-getrennte Eingaben, korrespondierend mit find -print0.

Das Flag -P N von xargs parallelisiert die Verarbeitung auf N parallele Prozesse, was bei CPU-intensiven Operationen erhebliche Laufzeitgewinne bringt. Das Flag -I {} definiert einen Platzhalter für den Dateinamen im Befehl, ähnlich wie find -exec. Das Flag -n 1 übergibt exakt eine Datei pro Befehlsaufruf, nützlich wenn der Befehl genau einen Dateinamen erwartet und keine Liste. Für das sichere Iterieren über Dateien mit externen Befehlen ist find -print0 | xargs -0 -P 4 -I {} cmd {} eine mächtige und effiziente Kombination – mit korrekter Leerzeichen-Behandlung durch die Nullbyte-Trennung und mit Parallelisierung durch -P.


#!/usr/bin/env bash
# xargs_patterns.sh — Efficient file processing with xargs -0
set -euo pipefail

SOURCE_DIR="${1:-.}"

# Process all .log files in parallel (4 jobs) — null-safe
echo "--- Compressing logs in parallel ---"
find "$SOURCE_DIR" -name "*.log" -type f -mtime +7 -print0 \
  | xargs -0 -P 4 -I {} gzip -9 {}

# Count lines in all .sh files using xargs batch mode
echo "--- Line counts for shell scripts ---"
find "$SOURCE_DIR" -name "*.sh" -type f -print0 \
  | xargs -0 wc -l \
  | sort -rn \
  | head -20

# Delete empty files safely (null-byte safe, parallel)
echo "--- Removing empty files ---"
find "$SOURCE_DIR" -type f -empty -print0 \
  | xargs -0 --no-run-if-empty rm --

# Run checksum on all files in directory tree
echo "--- Generating checksums ---"
find "$SOURCE_DIR" -type f -not -name "*.sha256" -print0 \
  | xargs -0 -P "$(nproc)" sha256sum \
  | sort -k2 > "${SOURCE_DIR}/checksums.sha256"

echo "[OK] Checksums written to ${SOURCE_DIR}/checksums.sha256"

# Verify all checksums
echo "--- Verifying checksums ---"
if cd "$SOURCE_DIR" && sha256sum --check --quiet checksums.sha256; then
  echo "[OK] All checksums valid"
else
  echo "[ERROR] Checksum mismatch detected" >&2
  exit 1
fi

Mironsoft

Shell-Automatisierung, robuste Dateioperationen und DevOps-Infrastruktur

Shell-Skripte, die auch mit Sonderzeichen in Dateinamen funktionieren?

Wir analysieren bestehende Shell-Skripte auf unsichere Iterationsmuster, ersetzen fragile Dateilistenbehandlung durch robuste find-print0-Muster und stellen sicher, dass Automatisierungsskripte auch mit realen Daten aus Produktionsumgebungen zuverlässig funktionieren.

Code-Review

ShellCheck-Analyse und manuelle Prüfung auf unsichere Iterationsmuster und Word-Splitting-Fehler

Refactoring

Unsichere Dateilistenbehandlung durch find-print0, Nullbytes und korrektes Globbing ersetzen

Testing

BATS-Tests mit Dateien mit Leerzeichen, Tabs und Sonderzeichen als Fixtures einrichten

10. Zusammenfassung

Das sichere Iterieren über Dateien und Verzeichnisse in Bash ohne die klassischen Leerzeichen-Probleme erfordert ein fundamentales Umdenken: Dateinamen sind keine einfachen Strings, sondern können jedes Byte außer / und Nullbyte enthalten. Das einzige zuverlässige Trennzeichen für Dateinamen ist deshalb das Nullbyte. Das Muster while IFS= read -r -d '' file; do ... done < <(find ... -print0) implementiert diese Erkenntnis vollständig und korrekt. Process Substitution statt Pipe verhindert das Subshell-Scoping-Problem. Globbing ist für einfache Fälle ohne find die portabelste Alternative.

xargs -0 kombiniert mit find -print0 und dem Parallelisierungsflag -P ist die effizienteste Methode für die Verarbeitung großer Dateimengen mit externen Befehlen. mapfile -d $'\0' befüllt Arrays elegant aus find -print0-Ausgaben in Bash 4.4+. ShellCheck erkennt unsichere Iterationsmuster automatisch und liefert bei jedem for f in $(find ...)-Muster die Warnung SC2044 mit dem korrekten Ersatzmuster. Diese Regeln zusammen machen Datei-Iteration in Bash robust, portabel und sicher – auch dann, wenn die Dateinamen aus Quellen stammen, die man nicht kontrolliert.

Dateien iterieren ohne Leerzeichen-Logik — Das Wichtigste auf einen Blick

Korrektes Muster

while IFS= read -r -d '' f; do ... done < <(find ... -print0) — nullbyte-sicher, kein Subshell-Problem, Bash 3.1+.

Warum nicht Pipe

find | while read läuft in Subshell — gesetzte Variablen außerhalb nicht sichtbar. Process Substitution < <() vermeidet das.

Globbing

for f in /dir/*.ext ist POSIX-sicher. [[ -f "$f" ]] || continue für den Fall keiner Treffer. shopt -s nullglob für leere Expansion.

Batch-Verarbeitung

find -print0 | xargs -0 -P 4 cmd für parallele Verarbeitung. mapfile -d $'\0' für Array-Befüllung in Bash 4.4+.

11. FAQ: Dateien und Verzeichnisse iterieren ohne kaputte Leerzeichen-Logik

1Warum bricht for f in $(find ...) bei Leerzeichen?
Bash teilt $(find ...) nach IFS (Leerzeichen, Tab, Newline) auf. Dateinamen mit Leerzeichen werden in mehrere Wörter aufgeteilt. Lösung: while IFS= read -r -d '' f; do ... done < <(find ... -print0).
2Was macht find -print0?
Gibt Dateinamen durch Nullbytes (0x00) getrennt aus. Da Nullbytes in Dateinamen nicht vorkommen können, ist diese Trennung absolut zuverlässig — unabhängig von Leerzeichen oder Sonderzeichen.
3Process Substitution statt Pipe?
find | while read läuft in Subshell — Variablen außerhalb nicht sichtbar. while ... < <(find) läuft im aktuellen Kontext — Variablen bleiben sichtbar.
4Wann Globbing statt find?
Globbing für einfache Fälle im bekannten Verzeichnis: for f in /dir/*.log. POSIX-portabel, kein Extra-Prozess. find für tiefe Bäume und komplexe Filterkriterien.
5Was bedeutet IFS= read -r -d ''?
IFS= deaktiviert Whitespace-Trimming. -r verhindert Backslash-Interpretation. -d '' nutzt Nullbyte als Trennzeichen. Alle drei Flags für sicheres Einlesen nullbyte-getrennter Dateinamen.
6Was macht shopt -s nullglob?
Ohne nullglob: kein Treffer expandiert zum Literal (*.log). Mit nullglob: leere Liste. for-Schleife wird bei keinen Treffern gar nicht ausgeführt statt mit dem Literal-String.
7xargs -0 sicher nutzen?
find -print0 | xargs -0 cmd. -P N für Parallelisierung, -n 1 für eine Datei pro Aufruf, -I {} für Platzhalter. --no-run-if-empty verhindert leere Ausführung.
8Was ist mapfile?
mapfile -d $'\0' -t files < <(find ... -print0) befüllt Array mit Dateinamen (Bash 4.4+). Besser als while-Schleife wenn Liste mehrfach benötigt wird. Nicht portabel zu Bash < 4.4.
9Unsichere Muster automatisch erkennen?
ShellCheck SC2044 warnt bei for f in $(find ...) mit korrektem Ersatzmuster. shellcheck -S warning skript.sh. In CI-Pipeline integrieren für automatische Prüfung bei jedem Commit.
10Newlines in Dateinamen möglich?
Ja, Unix erlaubt Newlines in Dateinamen. Deshalb ist Newline kein sicheres Trennzeichen — nur Nullbyte ist es. find -print0 und read -d '' sind die einzig korrekte Lösung für beliebige Dateinamen.