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 -0lit ces chemins sans ambiguïté.- utilisez toujours des guillemets autour de
{}ou de “$f”. -Pparallé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.