Copie arbo existante ou creation d'une arbo a partir d'un fichier txt

yandub

Membre confirmé
11 Août 2021
10
0
40
Bonjour,
Je suis a la recherche d'une solution pour copier l'arbo d'un repertoire de mon NAS en local sur un mac Bookpro.
J'ai cherché en commande terminal mais je n'ai pas trouvé.

Je souhaite copier l'arbo des dossiers mais sans les fichiers

Mon NAS a été attaqué par un rancomware et a crypté une grosse partie de mes fichiers (QLocker)
Je me retrouve avec certain nombre de fichiers viable et des .7z partout dans mon arbo... plutot que de faire du tri je préfère repartir de dossiers vides et d'essayer de retrouver le max de fichiers sur d'autres bkp.

J'ai une arbo d'environ 500 dossiers/Sous dossier pour organiser mes dizaines de milliers de photos et j'aimerai garder cette arbo.

Si ce n'est pas possible, j'ai un fichier txt avec mon arbo mais je ne sais pas comment créer une arbo de dossier a partir de ce fichier, ni comment le mettre en forme

Je l'ai créé en utilisant BBEdit, j'avais la liste des dossier et des fichiers mais j'ai supprimer les fichiers de se doc txt pour ne garder que les dossier.

Merci de votre aide
 

edenpulse

Membre expert
Club MacG
10 Août 2010
1 252
279

yandub

Membre confirmé
11 Août 2021
10
0
40
Tu peux utiliser des commandes linux dans le terminal macOS
https://www.cyberciti.biz/faq/linux-show-directory-structure-command-line/ comme tree (que tu peux installer via homebrew)

Donc un petit "tree /Volume > arbodossiers-list.txt"
Hello
j'avais essayé tree mais le terminal me donnait : zsh: command not found: tree
je regarde homebrew

et une fois l'arbo en txt tu sais comment générer la créations des dossiers a partir de ca ?
 

xDave

Membre confirmé
16 Juin 2011
10
1
Hello
j'avais essayé tree mais le terminal me donnait : zsh: command not found: tree
je regarde homebrew

et une fois l'arbo en txt tu sais comment générer la créations des dossiers a partir de ca ?
Au plus simple, tu devrais pouvoir utiliser rsync comme commande terminal et faire une exclusion des fichiers en .7z ou autre par exemple.

avec rsync -r --exclude="- *.7z" /CheminVersMonDossier/ /Users/monUser/Desktop/DossierDeDestination/

ou tous types de fichiers avec une extension
rsync -r --exclude="- ." /CheminVersMonDossier/ /Users/monUser/Desktop/DossierDeDestination/

Tu peux faire des patterns plus complexes, ou via une liste d'exclusion avec l'option -c

Je viens de tester les deux commandes en local sur un dossier plein de pdf, c'est quasi instantané

"man rsync" is your friend pour voir toutes les options
 

yandub

Membre confirmé
11 Août 2021
10
0
40
J'ai réussi a lancer la commande apres avoir installe Xcode et Homebrew.
Par contre pour recupérer que les dossiers il faut faire :
tree -d /Volume > arbo.txt
sinon il liste aussi tous les fichiers

Je continu de chercher comment créer l'arbo a partir de ce fichier.

il est formaté bizarement... a priori bug de syntaxe en UTF8
en mode txt ca ressemble a ca
/Volumes/Multimedia/Photos
├── 00.MobileUpload
│   ├── XXX
│   │   └── 7z
│   └── XX
│   └── 7z
├── 000.A_Trier
│   ├── 2017
│   │   ├── 2017-11-17
│   │   └── 2017-11-18
│   ├── 2019
│   ├── 7z
│   ├── MISC
│   ├── Moto
│   └── TOFS
│   └── 7z
├── AuPontDuRock


et sur BBEdit quand je force l'UTF8 j'ai un msg
Incorrectly formed UTF-8
The UTF-8 file “arboFolder.txt” is damaged or incorrectly formed; please proceed with caution.

ca bug sur les accents te les espaces mais ca a pas l'air mechant :
/Volumes/Multimedia/Photos
├── 00.MobileUpload
│ ├── XXXX
│ │ └── 7z
│ └── XXX
│ └── 7z
├── 000.A_Trier
│ ├── 2017
│ │ ├── 2017-11-17
│ │ └── 2017-11-18
│ ├── 2019
│ ├── 7z
│ ├── MISC
│ ├── Moto
│ └── TOFS
│ └── 7z
├── AuPontDuRock
│ ├── 2006
│ │ ├── AlainBoucly_Nashville
│ │ ├── aaaa
│ │ │ ├── 2006-07-28
│ │ │ │ └── Au\ Pont\ du\ Rock\ -\ Malestroit
│ │ │ │ ├── Festival
│ │ │ │ ├── Freedom\ for\ King\ Kong
│ │ │ │ ├── Hushpuppies
│ │ │ │ ├── Jok\ Lak\ E\ Barzh
│ │ │ │ ├── Les\ Hurlements\ de\ Le�\201o




merci
 

yandub

Membre confirmé
11 Août 2021
10
0
40
Au plus simple, tu devrais pouvoir utiliser rsync comme commande terminal et faire une exclusion des fichiers en .7z ou autre par exemple.

avec rsync -r --exclude="- *.7z" /CheminVersMonDossier/ /Users/monUser/Desktop/DossierDeDestination/

ou tous types de fichiers avec une extension
rsync -r --exclude="- ." /CheminVersMonDossier/ /Users/monUser/Desktop/DossierDeDestination/

Tu peux faire des patterns plus complexes, ou via une liste d'exclusion avec l'option -c

Je viens de tester les deux commandes en local sur un dossier plein de pdf, c'est quasi instantané

"man rsync" is your friend pour voir toutes les options
merci xDave mais en exclusions ca va etre vite lourd a gérer avec des fichiers photo en plein de formats differents (jpg, jpeg, CR2, ARW, Tif, DNG etc) et parfois des proxies qui trainent a cause de logiciel de traitement.
Et la je ne parle que du dossier Photo c'est pire avec le dossier video ou j'ai encore plus de format a cause de differentes cameras.
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 227
349
Lorraine
Bonjour,
peut être un petit applescript...
Au lancement du script il te demande de
  • Sélectionner le dossier d'origine contenant tous tes dossiers et sous dossiers.
  • Sélectionner une dossier vierge

Le script te crée dans la dossier vierge tous les dossiers et sous dossier de l'origine avec leurs arborescences.

le script

Bloc de code:
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les dossiers à dupliquer"
    set origine to chemin as string
    set destination to choose folder with prompt "Sélectionnez le dossier de destination"
    my inspecter(chemin, destination, origine)
end tell

on inspecter(un_dossier, destination, origine)
    set dest to destination as string
  
    tell application "Finder"
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
          
            -- traitement d'un dossier
            set ledossier to chaque_dossier as string --chemin en texte
            set nom to name of chaque_dossier -- récupère le nom du dossier en cours
          
            set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
            set AppleScript's text item delimiters to {origine}
            set fin to text item -1 of ledossier as string --récupère l arborecence dans le dossier original
            set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur 
          
          
            set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
            set AppleScript's text item delimiters to {nom}
            set fin2 to text items 1 thru -2 of fin as string -- arborescence moins le nom
            set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
          
            set dest2 to dest & fin2 -- le chemin complet sans le nom
          
            tell application "Finder"
              
                make new folder at dest2 with properties {name:nom} -- crée le dossier
              
            end tell
        end repeat
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier, destination, origine)
        end repeat
    end tell
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
  • J’aime
Réactions: yandub

yandub

Membre confirmé
11 Août 2021
10
0
40
t'es mon SAUVEUR !!!!
j’étais en train de m'embourber dans le terminal et les lignes de commande
ca commençait a être trop compliqué pour moi et j'y connais rien en applescript

et la ca fonctionne parfaitement

J'arrive un peu a lire/comprendre du code grace a des restes de mes etudes mais ca fait 20ans que j'en fais plus ;)

Merci beaucoup ! beaucoup
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 227
349
Lorraine
Content pour toi ! :up: :)
 

xDave

Membre confirmé
16 Juin 2011
10
1
merci xDave mais en exclusions ca va etre vite lourd a gérer avec des fichiers photo en plein de formats differents (jpg, jpeg, CR2, ARW, Tif, DNG etc) et parfois des proxies qui trainent a cause de logiciel de traitement.
Et la je ne parle que du dossier Photo c'est pire avec le dossier video ou j'ai encore plus de format a cause de differentes cameras.
Salut yandub

Comme précisé, je n'ai pas le contexte. tu semblais vouloir exclure les .7z. ça marche aussi avec toute extension avec un *, ou ne copier qu'un type de fichier.
Avec une liste ça donne
Bloc de code:
rsync -av --exclude-from={'list.txt'} sourcedir/ destinationdir/

ou list.txt est un fichier avec un item par ligne des fichiers à exclure (on peut aussi avoir une liste d'inclusion)
Alors en 3 lignes très brutes, ça donne
Bloc de code:
find /cheminDudosssieràcopier/ -type f > excludelist.txt

je liste dans un fichier "excludelist.txt" texte tous les fichiers (l'option -type f)

Je traite ensuite le fichier avec un regex string replace pour supprimer la hiérarchie de dossier et ne garder que les fichiers
Bloc de code:
^[/\\\\]?(?:.+[/\\\\]+?)?(.+?)[/\\\\]

J'ai fait ça dans Bbedit comme j'avais déjà le grep pattern

Ensuite tu utilises la liste d'exclusion via rsync
Bloc de code:
rsync -r /cheminDudosssieràcopier/ /cheminverslacopie/ --exclude-from="excludelist.txt"

ON pourrait tout faire en une ligne avec un pipe mais j'ai pas le temps hihihi…

Seul inconvénient, les packages sont considérés comme des dossiers.
donc j'ajouterais quand même un exclude par extension*, pas le temps de voir si on peut identifier un package via find.

voilà, hope that helps

note: ton fichier d'exclusion peut contenir des patterns, comme *.7z, ou *., ou exclure des dossiers;
tu peux aussi filtrer l'output de find par date de modification (par exemple uniquement les dossiers qui ont une date de modification antérieure à l'intrusion)…

PS: L'idée étant que le dossier est mega lourd sur un serveur distant et que je ne veux pas rapatrier le dossier sur mon Mac vu qu'en plus il est vérolé
 
Dernière édition:

yandub

Membre confirmé
11 Août 2021
10
0
40
Bonjour

la solution de zeltron54 est exactement ce que je cherchais ;)
Copier une Arbo de dossier sans les fichiers quelque soient les formats.

Simple et efficace.

Maintenant que j’ai toute mon arbo vide il faut que je remplisse les dossiers.
Et je cherche une app (gratuite) de synchro de fichiers (j’ai mes fichiers sur plein de DD externe et des doublons sur certains dossiers)
Vous utilisez quoi ?

on peut le sûrement le faire en terminal mais parfois un app c’est plus user friendly ;)

Merci
 

xDave

Membre confirmé
16 Juin 2011
10
1
Bonjour

la solution de zeltron54 est exactement ce que je cherchais ;)
Copier une Arbo de dossier sans les fichiers quelque soient les formats.

Simple et efficace.

Maintenant que j’ai toute mon arbo vide il faut que je remplisse les dossiers.
Et je cherche une app (gratuite) de synchro de fichiers (j’ai mes fichiers sur plein de DD externe et des doublons sur certains dossiers)
Vous utilisez quoi ?

on peut le sûrement le faire en terminal mais parfois un app c’est plus user friendly ;)

Merci
Je n'ai pas testé l'AppleScript mais je me le mets de côté :D et ravi que ça ait solutionné votre problème.

En gratuit mais terminal j'utilise cp ou ditto ou rsync selon où se trouve la source, ça dépend de ce que l'on veut faire.
En App à GUI de synchro/Backup de fichiers regarde cet article (en anglais), je ne saurais dire lequel est bon pour ce que tu veux .
sync software Mac
 

yandub

Membre confirmé
11 Août 2021
10
0
40
Hello

CCC c'est tres bien pour les bkp, ce que je cherche c'est plutot un finder avec 2 fenetres qui permet de synchroniser facilement 2 dossiers.

pas sur que ce soit adapté il faut sélectionner le dossier source et destinations c'est plus long et comme j'ai un nombre de dossier TRES elever c'est pas optimal. ;)

merci de ton aide
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 227
349
Lorraine
Bonjour,

Pas bien compris ce que tu veux faire exactement...

Qu'elle est la situation de départ ?
Que veux-tu obtenir ?
 

yandub

Membre confirmé
11 Août 2021
10
0
40
Bonjour

J'ai un dossier A qui est vide
J'ai un dossier B qui contient mes fichiers restauré que je vais copier dans A (mais la restauration a récupérer que 60% des fichiers)
J'ai également des bkp (DD externe qui peuvent contenir des fichier plus recents mais pas forcement tout.) > Dossier C

donc je vais copier les fichiers de B dans A et j'aimerai compléter avec les fichiers de C (qui contient surement des doublons)

Pour au final avoir dans A le maximum de fichiers

Je cherche un soft qui a des fonctions de synchro/copie plus avancés que le finder et si possible qui me permette d'avoir 2 fenetre cote a cote (comme total commander sur PC)
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 227
349
Lorraine
Si tu veux obtenir tous les fichiers de B plus ceux de C Dans le dossier A sans aucune arborescence, donc tous les fichiers directement dans A sans aucun sous dossier, cela doit pouvoir se faire avec un petit script.

Par contre si tu veux des sous dossiers dans le dossier A... Je ne connaît pas de solution autre de tout faire à la main...

Si la première hypothèse est la bonne, alors fais signe j'essaierai de te faire un petit script.
 

yandub

Membre confirmé
11 Août 2021
10
0
40
Si tu veux obtenir tous les fichiers de B plus ceux de C Dans le dossier A sans aucune arborescence, donc tous les fichiers directement dans A sans aucun sous dossier, cela doit pouvoir se faire avec un petit script.

Par contre si tu veux des sous dossiers dans le dossier A... Je ne connaît pas de solution autre de tout faire à la main...

Si la première hypothèse est la bonne, alors fais signe j'essaierai de te faire un petit script.
Pas de sous dossier tout est à la racine
Encore merci de ton aide
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 227
349
Lorraine
Voilà un petit script qui
1 - demande de sélectionner le dossier contenant les fichiers à copier (B)
2 - demande de sélectionner le dossier de destination (A)

Il copie tous les fichiers du dossiers B dans A

Il suffit de recommencer avec le dossier (C), - il copie tous les fichiers de C dans A après vérification qu'ils n'existe pas déjà dans A

le script

Bloc de code:
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichier à copier"
    set origine to chemin as string
    set destination to choose folder with prompt "Sélectionnez le dossier de destination"
    my inspecter(chemin, destination, origine)
end tell

on inspecter(un_dossier, destination, origine)
    set dest to destination as string
    
    tell application "Finder"
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            set nom to name of chaque_fichier --récupère le nom du fichier
            set destcontrole to dest & nom
            
            set lefichier to chaque_fichier as string
            
            if not (exists destcontrole) then
                duplicate lefichier to dest
            end if
            
        end repeat
        
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier, destination, origine)
        end repeat
    end tell
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

yandub

Membre confirmé
11 Août 2021
10
0
40
Voilà un petit script qui
1 - demande de sélectionner le dossier contenant les fichiers à copier (B)
2 - demande de sélectionner le dossier de destination (A)

Il copie tous les fichiers du dossiers B dans A

Il suffit de recommencer avec le dossier (C), - il copie tous les fichiers de C dans A après vérification qu'ils n'existe pas déjà dans A

le script

Bloc de code:
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichier à copier"
    set origine to chemin as string
    set destination to choose folder with prompt "Sélectionnez le dossier de destination"
    my inspecter(chemin, destination, origine)
end tell

on inspecter(un_dossier, destination, origine)
    set dest to destination as string
   
    tell application "Finder"
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            set nom to name of chaque_fichier --récupère le nom du fichier
            set destcontrole to dest & nom
           
            set lefichier to chaque_fichier as string
           
            if not (exists destcontrole) then
                duplicate lefichier to dest
            end if
           
        end repeat
       
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier, destination, origine)
        end repeat
    end tell
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
Top
pour savoir si il existe il se base sur le nom du fichier c’est bien ça ?

je vais essayer d’ajouter une vérification sur le poids du fichier ;)

merci