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



## yandub (11 Août 2021)

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 (11 Août 2021)

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)








						How to show recursive directory listing on Linux or Unix
					

Linux recursive directory listing command - Learn what a recursive listing of files is and how to get a recursive directory listing on Linux or Unix system.




					www.cyberciti.biz
				




Donc un petit "*tree /Volume > arbodossiers-list.txt*"


----------



## litobar71 (11 Août 2021)

bonjour,

je me sers parfois de PrintWindow (5.5) en démo 30 jours je crois.
je ne sais pas si c'est ce que tu recherches mais il est paramétrable et les .pdf obtenus me conviennent.


----------



## yandub (11 Août 2021)

edenpulse a dit:


> 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)
> 
> 
> ...


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 (11 Août 2021)

yandub a dit:


> 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 (11 Août 2021)

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 (11 Août 2021)

xDave a dit:


> 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/
> 
> ...


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 (11 Août 2021)

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


```
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
```


----------



## yandub (11 Août 2021)

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 (11 Août 2021)

Content pour toi !


----------



## xDave (11 Août 2021)

yandub a dit:


> 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

```
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

```
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

```
^[/\\\\]?(?:.+[/\\\\]+?)?(.+?)[/\\\\]
```

_J'ai fait ça dans Bbedit comme j'avais déjà le grep pattern_

Ensuite tu utilises la liste d'exclusion via rsync

```
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é


----------



## yandub (12 Août 2021)

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 (12 Août 2021)

yandub a dit:


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


Je n'ai pas testé l'AppleScript mais je me le mets de côté  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 (12 Août 2021)

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 (12 Août 2021)

Bonjour,

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

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


----------



## yandub (12 Août 2021)

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 (12 Août 2021)

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 (12 Août 2021)

zeltron54 a dit:


> 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 (12 Août 2021)

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


```
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 (12 Août 2021)

zeltron54 a dit:


> 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)
> 
> ...


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


----------



## zeltron54 (13 Août 2021)

Effectivement j'ai fais le test sur le nom !
Sur le poids me parait aléatoire car si la date de l'enregistrement et le nom ont changé, alors le poids aussi !


----------



## zeltron54 (13 Août 2021)

Bonjour,

Pour les doubles, le plus simple serait de rechercher les doubles après avoir fait le transfert de tous tes fichiers.
Faire une recherche de double en faisant un checksum des fichiers du dossier (A).

Si OK ! je te ferais le script de recherche de doubles.


----------



## zeltron54 (13 Août 2021)

Voilà !

Je te mets le script qui recherche les doubles dans un dossier et ses sous dossiers.
Il te demande de choisir le dossier, puis fais sa recherche sur le checksum des fichiers et crée un fichier texte  "Les doubles.txt" sur le bureau contenant le chemin des fichiers ayant le même checksum.
A toi de supprimer un des fichiers en double après vérification...


```
--recherche doubles dans un dossier y compris les sous dossier
tell application "Finder"
    set Chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à redater"
    my inspecter(Chemin)
end tell

on inspecter(Chemin)
    tell application "Finder"
        set Chemin to Chemin as string
        set repertoire to quoted form of POSIX path of Chemin as string
        set laliste to do shell script "cksum " & repertoire & "/* | sort"
       
        set nb to count paragraph of laliste
        repeat with i from 1 to nb
            set x to paragraph i of laliste
            --crée un fichier provisoire avec la list au format mac (CR+LF)
            set aa to ASCII character 10
            set lelog to open for access ((path to desktop folder as text) & "prov.txt") as text with write permission
            write x & aa to lelog starting at eof
            close access lelog
        end repeat
       
        -- traitement des dossiers :
        set Chemin to Chemin as alias
        set les_dossiers to folders of Chemin
        repeat with chaque_dossier in les_dossiers
            my inspecter(chaque_dossier)
        end repeat
       
    end tell
end inspecter

-- faire le tri du fichier prov et tester
set Chemin to ((path to desktop folder as text) & "prov.txt") as string
set repertoire to quoted form of POSIX path of Chemin
set laliste to do shell script "sort " & repertoire

set nb to count paragraph of laliste
repeat with i from 1 to nb - 1
    set x to paragraph i of laliste
    set xx to characters 1 thru 17 of x as string
   
    set y to paragraph (i + 1) of laliste
    set yy to characters 1 thru 17 of y as string
   
    if xx = yy then
        set x to characters (offset of "/" in x) thru end of x as string
        set y to characters (offset of "/" in y) thru end of y as string
        --cree le fichier double
        set lelog to open for access ((path to desktop folder as text) & "les doubles.txt") as text with write permission
        write "DOUBLE  : " & x & " AVEC " & y & return to lelog starting at eof
        close access lelog
    end if
   
end repeat
--efface le fichier provisoire
set aeffacer to quoted form of POSIX path of ((path to desktop folder as text) & "prov.txt")
do shell script "rm " & aeffacer

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## jcezanna54 (8 Août 2022)

pour copier une arborescence avec les fichiers :


> cd REP_origine
> find . | cpio -pdmuv REP_destination


pour copier une arborescence sans les fichiers, c'est plus compliqué :


> cd REP_origine
> find . -type d | sed -n -e 's,^,mkdir REP_destination/, -e p | sh


Mais cela me semble plus simple.....


----------

