Automatisation de copie de certains fichiers en préservant architecture globale de dossiers.

igorbatchev

Membre actif
22 Novembre 2009
448
15
Bonsoir,

Je vous écris pour savoir si quelqu'un aurait une solution informatique pour me faire gagner faicilement un quart d'heure demain et probablement plus dans les mois qui viennent.

J'ai un disque dur avec plein de rushs vidéos et son dedans, avec une architecture de la sorte :

DDE
DDE/A
DDE/A/video1
DDE/A/video2
DDE/A/son1
DDE/A/son2
DDE/B
DDE/B/video1
DDE/B/video2
DDE/B/son1
DDE/B/son2
etc etc


En gros j'ai beaucoup de dossier qui ont pour nom une date de tournage, avec dedans des dossiers vidéos et des dossiers sons.

Ma mission : copier tous les dossiers sons sur un autre disque dur, mais en gardant l'architecture globale. Donc obtenir ça :

DDE
DDE/A
DDE/A/son1
DDE/A/son2
DDE/B
DDE/B/son1
DDE/B/son2
etc etc

Donc bien sûr je peux utiliser pathfinder ou ouvrir deux fenêtre finder, avec d'un côté mon disque dur avec tous les rushs et de l'autre mon disque destination des copies, et à la main créer un nouveau dossier A, copier son1 et son2 dans A, et pareil pour tous mes dossiers...

Mais ce que je voudrais faire ce serait sélectionner tous les dossiers A B C etc etc, et les copiers, mais sans leur contenu. Genre après quand je fais coller sur le DDE de destination, j'ai tous les dossiers mais vides. Comme ça je peux transférer à la main ce que je veux (ça je peux pas l'automatiser) (enfin si je pourrais, mais ça va me prendre trop de temps). Bref je veux me passer de l'étape en gras ci-dessus.

J'ai essayé de faire ça sur automator :
Voir la pièce jointe 120611
mais bien sur ça me copie aussi tout ce qu'il y a dans le dossier...
Est-ce que quelqu'un aurait une idée ? Bonne soirée
Igor
 
La commande suivante permet de synchroniser deux répertoires suivant les filtres indiqués.
Bloc de code:
rsync -avr --include="*.mp3" --include="*.m4a" --exclude="*" "/disque_source/repertoire_source/" "/disque_cible/repertoire_cible"
Tu peux aussi rajouter un --delete pour qu'il supprime côté cible les fichiers supprimés côté source depuis la dernière fois que tu as fait cette commande.

Par contre, je te conseille de faire un test avec deux répertoires bidons pour voir si ça peut t'aller.
 
OK cool !
J'ai fait différents essais mais sans succès...
Voilà le dernier essai que j'ai fait et que j'aurais pensé concluant :

Bloc de code:
~ manjak$ rsync -avr --include="*.mp3" --include="*.m4a" --exclude="*" "/DK_1/Unknown Album/" "/backup_2/TEST/"
building file list ... rsync: link_stat "/DK_1/Unknown Album/." failed: No such file or directory (2)
done
rsync: mkdir "/backup_2/TEST" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at /SourceCache/rsync/rsync-42/rsync/main.c(544) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at /SourceCache/rsync/rsync-42/rsync/io.c(452) [sender=2.6.9]

Ca a l'air d'être des bêtes histoires de chemin mais je capte pas le problème.
 
Fait
Bloc de code:
ls /Volumes
pour avoir le nom de tes disques. Ils apparaitront dans la liste.

Par exemple, moi j'ai une clé usb : "/Volumes/USB 128 Go"
Par sécurité, j'utilise rsync pour sauvegarder dessus des photos que je n'ai pas encore traité. Je passe la commande :
Bloc de code:
rsync -avr --delete --exclude=".DS_Store" "/Users/mon_user/Pictures/A traiter/" "/Volumes/USB 128 Go/Photo"
 
La commande rsync si dessus va copier les fichiers, pas uniquement répliquer l'arborescence.
Hors il me semble que c'est ce qu'il voulait en fait.

Pour dupliquer seulement l'arborescencen, sans dupliquer les fichiers contenus :

Bloc de code:
rsync -avr --exclude=".DS_Store" --filter="-! */" source_dir/ target_dir/

Y'a d'autres moyens, via find | et mkdir --p, mais bon...
 
Dernière édition:
Cool, ça marche !
Mais maintenant pb suivant...
Ca ne marche que si je donne le chemin d'un fichier avec des fichiers son dedans, mais pas si je donne un chemin avec des dossiers contenant eux mêmes des fichiers son... Je crois que c'est le sens de la remarque de byte_order, sauf que je crois aussi que la ligne qu'il propose va me faire un back up total, sans me laisser de côté les vidéos... Juste pour comprendre ça veut dire quoi exclude="*" ?
 
En effet je voulais répliquer l'arborescence... Mais en fait le rêve c'est de répliquer l'arborescence plus tous les fichiers son qui sont à l'intérieur des différents dossiers de cette arborescence!
 
non non, ma ligne de commande ne duplique que l'arborescence, aucun fichier n'est dupliqué, c'est l'objet du filter :
-! => not (donc filter tout ce qui ne verifie pas la suite... qui est :
*/ => nom qui se termine par un slash, c.a.d. en notation rsync, un répertoire.

Donc toutes les entrées dans source_dir qui n'est pas un dossier est flitrer de la synchronistation.
Cela duplique donc uniquement les dossiers, rien d'autre.
 
Ah, pour dupliquer également les fichiers son (mais pas les fichiers vidéo) va falloir trouver un moyen de les identifier comme tel.
Un nommage particulier, ou une extension particuliere est utilisée ?
 
Du coup il me faudrait un mix entre

rsync -avr --include="*.mp3" --include="*.m4a" --exclude="*" "/disque_source/repertoire_source/" "/disque_cible/repertoire_cible"
et
rsync -avr --exclude=".DS_Store" --filter="-! */" source_dir/ target_dir/

genre :
rsync -avr --exclude=".DS_Store" --filter="-! *.mp3" --filter="-! *.m4a" /" "/disque_source/repertoire_source/" "/disque_cible/repertoire_cible"

ça devrait marcher... damned ça marche pas.
 
Bloc de code:
rsync -avr --include="*/" --include="*.mp3" --include="*.wav" --exclude="*" "/disque_source/repertoire_source/" "/disque_cible/repertoire_cible"

Premier include : on prend tous les dossiers
Second include : on prend aussi les .mp3
Troisème include : on prend aussi les .wav
Exclude : on jette le reste.
 
Dernière édition:
rsync -avr --include="*.mp3" --include="*.wav" --exclude="*" "/disque_source/repertoire_source/" "/disque_cible/repertoire_cible"

C'est grosso modo la même ligne que celle indiquée par ecatomb plus haut non ? Le pb c'est justement que ça me met pas les arborescences puisque ça exclue les répertoires !
 
rsync -avr --include="*.mp3" --include="*.wav" --exclude="*" "/disque_source/repertoire_source/" "/disque_cible/repertoire_cible"

C'est grosso modo la même ligne que celle indiquée par ecatomb plus haut non ? Le pb c'est justement que ça me met pas les arborescences puisque ça exclue les répertoires !
j'avais oublié le premier --include="*/", désolé.
 
Ca donne ça :

rsync -avr --include="*/" --include="*.mp3" --include="*.wav" --exclude="*" "/disque_source/repertoire_source/" "/disque_cible/repertoire_cible"

Ca marche ! Merci à vous deux !

Maintenant : comprendre.
Pourquoi --include="*/" et --exclude="*" s'annulent pas ? Genre "inclus les répertoires mais exclue les répertoires" ?
 
La syntaxe rsync des "pattern" utilise / en fin de pattern pour dire "nom d'un répertoire"
Le premier include designe tout répertoire quelque soit son nom.
Tandis que le exclude, lui, n'ayant pas de / en fin de pattern, désigne tout nom de fichier, sauf ceux explicitement sélectionné par un include (ici, les *.mp3 et les *.wav, donc)

Voilà une rapide explication du rsync-powa ;-)