La commande ditto, l'outil natif de copie macOS
Introduction
La commande ditto est l'utilitaire de copie de fichiers le plus fiable pour préserver l'intégrité complète des données macOS, incluant les resource forks, les attributs étendus, les ACLs et les métadonnées HFS+/APFS.
Développée par Apple et intégrée à macOS depuis la version 10.0, elle surpasse cp pour toute copie locale nécessitant une préservation fidèle des attributs système.
Cependant, son absence de synchronisation incrémentale et de support réseau natif la rend inadaptée aux sauvegardes régulières, où rsync ou des outils tiers (comme Carbon Copy Cloner) dominent.
Néanmoins, pour une copie unique de fichiers macOS avec toutes leurs métadonnées, ditto reste le choix optimal.
Syntaxe complète et référence des options
La syntaxe de ditto diffère fondamentalement de cp : elle copie le contenu d'un répertoire source vers la destination, plutôt que le répertoire lui-même.
Cette distinction est cruciale pour éviter les erreurs de structure.
# Copie basique (copie le CONTENU de src dans dst)
ditto source destination
# Copie avec création automatique de l'arborescence destination
ditto ~/Documents/projet /Volumes/Backup/projet
# Mode verbeux affichant chaque fichier copié
ditto -V ~/Desktop/work /Volumes/external
# Création d'archive ZIP compatible Finder
ditto -c -k --sequesterRsrc --keepParent App.app Archive.zip
# Extraction d'archive ZIP
ditto -x -k archive.zip destination/
# Copie sans métadonnées (compatibilité cross-platform)
ditto --norsrc source destination
Options de préservation des métadonnées
Les options de préservation des métadonnées constituent le cœur de la puissance de ditto.
Depuis macOS 10.5, les options --rsrc, --extattr, --acl et --qtn sont activées par défaut, garantissant une copie fidèle sans configuration supplémentaire.
- --hfsCompression : Permet de compresser les fichiers sur volumes HFS+/APFS
- --preserveHFSCompression : Activée par défaut, maintient la compression existante
- --clone : Exploite le copy-on-write APFS pour des copies quasi-instantanées sur le même volume
Gestion des archives
La gestion des archives offre trois formats :
- CPIO : Format par défaut
- CPIO compressé : gzip (
-z) ou bzip2 (-j) - PKZip : Format standard (
-k)
L'option --sequesterRsrc stocke les métadonnées macOS dans un sous-dossier __MACOSX pour compatibilité avec les systèmes non-Apple, tandis que --keepParent intègre le nom du répertoire parent dans l'archive.
Préservation des métadonnées : ce que ditto protège automatiquement
La supériorité de ditto réside dans sa gestion transparente de l'écosystème de métadonnées macOS.
Resource Forks
Les resource forks, vestiges de l'architecture classique Mac OS, sont préservés par défaut depuis macOS 10.4.
Sur les systèmes de fichiers non-natifs (FAT32, NTFS, ext4), ditto crée automatiquement des fichiers AppleDouble (préfixés ._) pour stocker ces données.
Les attributs étendus (xattr)
Les attributs étendus englobent un spectre critique d'informations :
- Tags Finder colorés
- Informations de quarantaine des fichiers téléchargés
- Attributs de notarisation Apple
- Métadonnées personnalisées
Ditto préserve ces attributs jusqu'à leur limite de 64 MiB par fichier, contrairement à la limite de 128 Ko souvent citée par erreur.
Access Control Lists (ACLs)
Pour les ACLs, ditto maintient les permissions granulaires au-delà du modèle Unix traditionnel.
Cependant, une subtilité importante : ditto ne modifie pas les ACLs des répertoires existants à destination — seuls les fichiers sont mis à jour.
Attribut de quarantaine
L'attribut com.apple.quarantine mérite une attention particulière. Cet attribut étendu, appliqué aux fichiers téléchargés depuis Internet, déclenche le dialogue "Cette application a été téléchargée depuis Internet" de Gatekeeper. Ditto préserve cet attribut par défaut (--qtn), mais l'option --noqtn permet de le supprimer lors de la copie.
Comparaison avec rsync : deux philosophies distinctes
La comparaison ditto/rsync révèle des outils aux philosophies fondamentalement différentes. Ils ne peuvent pas être véritablement comparés. rsync excelle dans la synchronisation incrémentale et le transfert réseau, là où ditto privilégie l'intégrité des métadonnées macOS.
Performances comparées
- Copies initiales complètes : Performances comparables, ditto légèrement plus lent en raison du traitement systématique des métadonnées
- Mises à jour ultérieures : rsync domine radicalement. Sur 300 Go de données avec 5 Go de modifications, rsync ne transfère que les 5 Go modifiés, tandis que ditto recopie l'intégralité
Configuration de rsync pour macOS
La préservation des métadonnées macOS avec rsync nécessite une configuration spécifique :
- Version Apple (v2.6.9, 2006) : Utilise le flag
-Epour les attributs étendus et resource forks - Version Homebrew moderne (v3.x) : Requiert
-X(attributs étendus),-A(ACLs) et--fileflagsséparément
Cette fragmentation des options constitue une source d'erreurs fréquente.
Support réseau
Le support réseau natif de rsync via SSH est absent de ditto. Une solution de contournement existe en pipant ditto vers SSH :
ditto -c source - | ssh remote_host ditto -x - /destination
Cette approche reste cependant inférieure à rsync pour les transferts volumineux.
Comparaison avec cp et les outils tiers
Face à cp
Ditto offre trois avantages majeurs par rapport à cp :
- Préservation automatique des métadonnées sans flags
- Création automatique des répertoires destination
- Comportement de fusion plutôt que de remplacement
Depuis macOS 10.4, cp gère correctement les resource forks avec -p, mais reste moins intuitif pour les copies préservant l'intégrité macOS.
Outils professionnels
Les outils professionnels comme Carbon Copy Cloner (CCC), SuperDuper! et ChronoSync n'utilisent pas ditto comme moteur principal :
- CCC : Intègre une version modifiée de rsync 3.0.6 avec des patches spécifiques (crtimes.diff, fileflags.diff)
- ChronoSync : Utilise son propre moteur et recourt à asr (Apple Software Restore) pour les sauvegardes bootables sous Big Sur et versions ultérieures
Ces outils surpassent ditto pour les sauvegardes régulières grâce à :
- La copie incrémentale
- La planification intégrée
- La vérification automatique
- La gestion des snapshots APFS
CCC, ChronoSync ou SuperDuper étant payants, ils représentent néanmoins un investissement justifié pour les environnements de production.
Fiabilité et comportement en conditions réelles
Intégrité des données
En termes d'intégrité des données, ditto effectue par défaut des copies atomiques : les fichiers sont d'abord écrits temporairement, puis renommés atomiquement, garantissant qu'un fichier destination est toujours complet ou absent. L'option --nonAtomicCopies désactive ce comportement pour des copies marginalement plus rapides au détriment de la sécurité.
Gestion des fichiers volumineux
La gestion des fichiers volumineux ne pose aucun problème : ditto supporte nativement les fichiers de plus de 4 Go (support 64-bit). Pour les archives CPIO, l'option --segmentLargeFiles segmente automatiquement les fichiers dépassant 8 Go.
Problèmes connus
Un problème documenté concerne les archives ZIP corrompues : le processus ditto peut consommer 85%+ du CPU indéfiniment. Ce comportement "runaway" nécessite un arrêt forcé via Activity Monitor. Des erreurs "Invalid Argument" peuvent également survenir avec certains attributs étendus malformés.
Déploiements entreprise
Pour les déploiements entreprise, ditto est régulièrement utilisé dans les scripts Jamf et Munki pour la distribution de configurations. Sa présence native sur tous les Mac et son comportement prévisible en font un choix fiable pour les opérations automatisées simples.
Spécificités APFS, bundles et signature de code
Intégration avec APFS
L'intégration avec APFS apporte des capacités spécifiques. L'option --clone exploite le clonage APFS (copy-on-write) pour des copies quasi-instantanées sur le même volume, sans duplication réelle des données. Cette fonctionnalité ne s'active que pour les copies intra-volume.
Gestion des bundles
La gestion des bundles (.app, .framework, .bundle) illustre un avantage critique de ditto. La documentation Apple Developer insiste :
"Utilisez ditto plutôt que cp pour copier du code. ditto préserve les liens symboliques, essentiels à la structure des frameworks Mac."
Une copie de framework avec cp -r peut briser les symlinks Versions/Current, rendant le bundle inutilisable et cassant la signature de code.
Notarisation Apple
Pour la notarisation Apple, ditto est l'outil recommandé pour créer les archives ZIP :
ditto -c -k --keepParent "MonApp.app" "MonApp.zip"
xcrun notarytool submit MonApp.zip --keychain-profile profil --wait
Les archives créées avec le zip standard peuvent échouer à la notarisation avec l'erreur "The signature of the binary is invalid".
System Integrity Protection
L'attribut SF_RESTRICTED et l'attribut étendu com.apple.rootless, liés à System Integrity Protection, sont préservables via --persistRootless lors de copies de fichiers système.
Limitations majeures et solutions alternatives
Absence d'option --delete
L'absence d'option --delete constitue la limitation la plus significative. Ditto ne supprime jamais les fichiers à destination qui n'existent plus à la source. Pour une synchronisation avec suppression, rsync reste incontournable :
rsync -av --delete /source/ /destination/
Exclusion de fichiers
L'impossibilité d'exclure des fichiers par pattern (équivalent de --exclude de rsync) contraint à utiliser les fichiers BOM (Bill of Materials) avec --bom, une approche nettement moins flexible.
Systèmes de fichiers non-Apple
Concernant les systèmes de fichiers non-Apple :
- NFS : Supprime tous les attributs étendus
- iCloud Drive : Ne préserve que certains attributs
com.apple.* - NTFS : En lecture seule sans pilotes tiers
- FAT32/exFAT : Perdent inévitablement certaines métadonnées malgré les fichiers AppleDouble
Versions de documents
Les versions de documents macOS (stockées dans .Document-Revisions-V100) ne sont pas copiées par ditto. Des outils spécialisés comme Revisionist sont nécessaires pour cette préservation.
Quand utiliser ditto versus les alternatives
Privilégiez ditto pour :
- Les copies locales uniques préservant toutes les métadonnées
- La création d'archives ZIP pour notarisation
- Les scripts de déploiement simples
- La copie de bundles et frameworks
- L'archivage APFS transparent
Privilégiez rsync pour :
- Les sauvegardes incrémentales régulières
- Les transferts réseau via SSH
- La synchronisation bidirectionnelle avec suppression
- Les scripts cross-platform Linux/macOS
- Les opérations interruptibles et reprises
Privilégiez les outils tiers pour :
- Les sauvegardes bootables automatisées
- Les environnements nécessitant une interface graphique
- La gestion de snapshots APFS
- Les scénarios enterprise avec planification et notifications
Conclusion
La commande ditto représente l'approche d'Apple à la copie de fichiers : une intégration profonde avec l'écosystème macOS au détriment de la flexibilité cross-platform. Son point fort réside dans la préservation transparente des métadonnées — resource forks, attributs étendus, ACLs, quarantine — sans configuration particulière. Pour les développeurs macOS, ditto est indispensable pour les archives de notarisation et la copie de frameworks préservant la signature de code.
Cependant, l'absence de synchronisation incrémentale et de support réseau natif la cantonne aux opérations ponctuelles. Une stratégie de sauvegarde robuste combine typiquement ditto pour la copie initiale préservant l'intégrité maximale, puis rsync pour les mises à jour incrémentales. Cette complémentarité exploite les forces de chaque outil plutôt que de forcer l'un dans un rôle inadapté.
Pour les environnements de production exigeant automatisation et fiabilité, les outils commerciaux comme Carbon Copy Cloner — qui utilise précisément rsync modifié sous le capot — offrent l'abstraction nécessaire sans sacrifier la performance.
↑ Haut de page