← retour aux snippets

find et xargs sécurisés avec -print0

Traiter des fichiers aux noms complexes avec find -print0 et xargs -0.

bash shell #find#xargs#cli

objectif

Parcourir et traiter des fichiers en toute sécurité même s’ils contiennent espaces, guillemets ou retours à la ligne.

code minimal

# compresser en parallèle tous les .log sans casser sur les espaces/newlines
find . -type f -name "*.log" -print0 | xargs -0 -n1 -P4 gzip -n

utilisation

# lister les cibles sans les modifier (dry-run lisible)
find . -type f -name "*.log" -print0 | xargs -0 -I{} printf '%s\n' "{}"

# déplacer des CSV vers ./archive de façon sûre (création auto du dossier)
mkdir -p ./archive
find . -type f -name "*.csv" -print0 \
  | xargs -0 -I{} -n1 -P4 sh -c 'set -Eeuo pipefail; mv "$1" "./archive/"' sh {}

# calculer des checksums SHA256 de gros fichiers (>100M) sans se casser sur les noms
find . -type f -size +100M -print0 | xargs -0 -n1 -P4 shasum -a 256

variante(s) utile(s)

# alternative sans xargs: boucle sûre au NUL
while IFS= read -r -d '' f; do
  gzip -n "$f"
done < <(find . -type f -name "*.log" -print0)

# avec -exec pour éviter xargs (un fichier par appel)
find . -type f -name "*.log" -exec gzip -n {} \;

# limiter la profondeur et ignorer certains dossiers
find . -maxdepth 2 -type f -not -path "./vendor/*" -name "*.php" -print0 \
  | xargs -0 -n1 -P4 php -l

notes

  • -print0 émet des chemins séparés par NUL; xargs -0 lit ces chemins sans ambiguïté.
  • utilisez toujours des guillemets autour de {} ou de “$f”.
  • -P parallélise les traitements (choisissez selon vos ressources).
  • pour un vrai “dry-run”, remplacez la commande par printf '%s\n' "{}" ou ajoutez une option de simulation si disponible.