Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/10/2009, à 08:50

soupaloignon

Copier une arborescence de dossier sans les fichiers

Bonjour à tous,

Je cherche le moyen de copier toute une arborescence existante (ayant un nombre variable et indéfini de dossiers, sous dossiers etc..) sans les fichiers contenus dans l'arbo d'origine. Recréer la même arborescence, mais vide.

J'ai essayé il y a quelque temps avec rsync et une option excluant tous les fichiers, mais cela n'avait pas marché, et il restait des résidus. Avez-vous des pistes ?

L'idée finale c'est de pouvoir copier par la suite des fichiers dont ont déterminerait l'extension, mais en conservant l'arborescence d'origine.
Du genre : fait une copie de tous les fichiers .pdf (avec un paramètre insensible à la casse) et hop, ça recrée une arbo, avec juste les fichiers .pdf rangés dans les mêmes dossiers.
Et aussi : fait une copie de tous les fichiers .php .css (un nombre X d'extensions possibles, toujours avec insensibilité à la casse de l'extension)

Merci d'avance pour vos idées

Dernière modification par soupaloignon (Le 29/10/2009, à 13:07)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#2 Le 29/10/2009, à 09:22

lebendre

Re : Copier une arborescence de dossier sans les fichiers

Un logiciel tout fait, je ne connais pas, mais avec un script bash bien réglé, on devrait pouvoir le faire!
http://doc.ubuntu-fr.org/tutoriel/script_shell

Hors ligne

#3 Le 29/10/2009, à 09:29

k-o-x

Re : Copier une arborescence de dossier sans les fichiers

Sinon:

RACINE=/source/racine
DEST=/destination/nouvelleracine

cd $RACINE
find . -type d | while read dossier; do
    mkdir -p "$DEST/$dossier"
done

Et avec les fichiers:

RACINE=/source/racine
DEST=/destination/nouvelleracine
EXTS="php css js"

cd $RACINE
find . -type d | while read dossier; do
    mkdir -p "$DEST/$dossier"
done
for ext in $EXTS; do
    find . -iname "*.$ext" | while read fichier; do
        dossier=$DEST/`dirname "$fichier"`
        cp "$fichier" "$dossier"
    done
done

(on peut faire plus propre, mais faut que j'aille bosser big_smile )

Dernière modification par k-o-x (Le 29/10/2009, à 09:35)

Hors ligne

#4 Le 29/10/2009, à 10:31

frafa

Re : Copier une arborescence de dossier sans les fichiers

Bonjour,
pourquoi ne pas regarder du coté de find et exec...
genre pour les dossiers:

find /chemin-source -type d -exec mkdir -p $HOME/copiedir{} \;

Dernière modification par frafa (Le 29/10/2009, à 10:32)

Hors ligne

#5 Le 29/10/2009, à 10:56

soupaloignon

Re : Copier une arborescence de dossier sans les fichiers

Merci pour vos réponses

lebendre a écrit :

Un logiciel tout fait, je ne connais pas, mais avec un script bash bien réglé, on devrait pouvoir le faire!

Je ne l'avais pas précisé effectivement, mais c'était à du bash que je pensais



k-o-x a écrit :

Sinon:

 le code

Et avec les fichiers:

 le code

(on peut faire plus propre, mais faut que j'aille bosser big_smile )

Génial, un grand merci, ça marche à la perfection. Je vais bricoler quelques variables à rentrer via zenity, et une liste de la nouvelle arbo et des fichiers dans un fichier texte, et ça roule.

Merci encore smile


Edit : Merci a toi aussi frafra, ton message n'y étais pas lorsque j'ai commencé à écrire le mien (oui, j'ai fait une grande pause wink). Je vais tester ta solution aussi.

Dernière modification par soupaloignon (Le 29/10/2009, à 11:01)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#6 Le 29/10/2009, à 13:05

soupaloignon

Re : Copier une arborescence de dossier sans les fichiers

Bon, je poursuis le sujet car je bute sur quelques améliorations "cosmétiques".

Déjà voila le script avec la liste de choix des extensions, et la génération d'un fichier texte

#!/bin/bash

RACINE=/source/racine
DEST=/destination/nouvelleracine
NOM="00-liste-avec-extension"

EXTS=$(zenity --list --checklist --width=500 --height=350 \
        --title "Sélection" \
        --text="Sélectionner les extensions à conserver" \
        --column="Choix ?" --column="Extensions" \
        TRUE    "php" \
	FALSE   "css" \
	FALSE   "xcf" \
        FALSE   "" \
	FALSE	"" \
	FALSE	"" \
	FALSE	"" \
        FALSE	"" \
	FALSE	"" );

        if [ "${PIPESTATUS[0]}" != "0" ]; then
            exit
        fi


cd $RACINE
find . -type d | while read dossier; do
    mkdir -p "$DEST/$dossier"
done
for ext in $EXTS; do
    find . -iname "*.$ext" | while read fichier; do
        dossier=$DEST/`dirname "$fichier"`
        cp "$fichier" "$dossier"
    done
done


cd $DEST
ls -R -U -B -p > $DEST/"$NOM"-"$EXTS"


zenity --info  --text="Le travail est terminé sur les fichiers avec l'extension(s) \n\n '$EXTS' "

Pour les améliorations cosmétiques je bute sur les points suivants :

Lorsque je sélectionne 2 types d'extensions (php et css) au final le nom du fichier va être : 00-liste-avec-extension-php|css
Je voudrais virer le (ou les si plusieurs) | du nom de fichier, et le remplacer par un - (ou plusieurs)
J'ai essayé a grand coup de sed, de rename, mais manifestement le symbole | n'est pas considéré comme un caractère et cela met le bronx dans la commande. Si quelqu'un a une idée la dessus (j'ai essayé d'échapper avec des quotes, mais cela ne change rien)

Idem pour la fenetre zenity d'information de fin de traitement, elle renvoi un

Le travail est terminé sur les fichiers avec l'extension(s) 
 'php|css'

donc pas très joli

Dernière modification par soupaloignon (Le 29/10/2009, à 15:08)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#7 Le 29/10/2009, à 13:28

AnsuzPeorth

Re : Copier une arborescence de dossier sans les fichiers

Bjr,
Avec l'option zenity '--separator' peut être ?


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#8 Le 29/10/2009, à 13:47

soupaloignon

Re : Copier une arborescence de dossier sans les fichiers

Merci AnsuzPeorth pour ton info.

Je ne connaissais pas cette option. Par contre elle marche bien et permet de mettre un - là où je voulais. Mais problème...

La copie des fichiers ne se fait plus et je me retrouve avec une arbo vide big_smile

(j'ai mis le --separator dans la variable du choix d'extensions)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#9 Le 31/10/2009, à 03:13

AnsuzPeorth

Re : Copier une arborescence de dossier sans les fichiers

Je pense que l'erreur vient du fait que tu as remplacé le | par un - . Donc la variable EXTS contient maintenant "css-php".
Le find de la boucle for cherchera donc des fichiers avec "css-php" (d'ailleurs, si cela fonctionnait avant, il faut croire que le | est considéré par for comme une séparation de données ???).

Personnellement, je garderais le séparateur d'origine (et l'enlèverais juste pour le nom), ca servirait dans la recherche si on utilise egrep. Par contre, si je dis pas de bêtises, egrep utilise une ER, et comme Totor nous le répète souvent, l'ER consomme smile , mais si tu n'as pas 250 000 fichiers/dossiers à traiter, ca devrait pas être trop grave  !

Je ferais un truc du genre pour la boucle de recherche:

EXTS="php|css"
find . -type f | egrep "($EXTS)" |  while read fichier
do

done
#ou 
while read fichier
do

done < <(find . -type f | egrep "($EXTS)")

On pourrait utiliser -iregex de find, mais il faudrait modifier le séparateur en \|. (la substitution est séparée de find pour la compréhension, sinon ca fais un truc illisible.)

EXTS=${EXTS//|/\\|}
find . -type f -iregex ".*\.\($EXTS\)"

Pour remplacer ensuite le | par -, même  principe la substitution bash.

EXTS=${EXTS//|/-}

Tu pourrait aussi utiliser la substitution à la place de basename !
Regarde ce post les interventions de totor, il explique mieux que je pourrais le faire smile
http://forum.ubuntu-fr.org/viewtopic.php?id=352624


Pour répondre en même temps à la question de ton autre post au sujet de supprimer des lignes précédentes si correspondance et tout le toutim.... Tu risques de te prendre la tête ! Je ne sais pas si la présentation du fichier résultant à de l'importance, mais pourquoi ne pas récupérer les infos dans la boucle de copie ?

Dernière modification par AnsuzPeorth (Le 31/10/2009, à 03:17)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#10 Le 04/12/2014, à 21:54

julien.drouin.b

Re : Copier une arborescence de dossier sans les fichiers

Bonjour

Mon sujet est très similaire. Je veux me développer un système de sauvegarde/synchronisation de mes fichiers de mon ordinateur vers mon disque dur externe. L'arborescence de mon disque dur externe (rempli à 1,5 TB) étant très ramifiée, je ne veux pas être obligé de classer fichier par fichier, car c'est très très long. NB : Je voyage souvent avec mon portable sans mon disque dur externe évidemment

J'aimerais donc copier l'arborescence de dossiers et sous-dossiers de mon disque dur externe sans les fichiers sur mon ordinateur; pour ensuite pouvoir classer mes fichiers sur mon ordinateur au fur et à mesure dans l'arborescence "miroir", sans être connecté à mon disque dur externe; et finalement, faire une sauvegarde de mes fichiers dans l'arborescence "miroir" de mon ordinateur vers l'arborescence de mon disque dur externe qui je connecte ce dernier.

(Ou est-ce possible de créer une genre de copie "fantôme" de l'arborescence de mon disque dur externe ? Du type que j'ai la même arborescence sur mon portable et je peux y glisser les fichiers qui sont en latence jusqu'au moment où je connecte le disque dur externe. À ce moment, le transfert se fait automatiquement... Ça existe ?)

Donc, 2 étapes selon moi :

1. Copier l’arborescence de mon disque dur externe sans les fichiers sur mon ordinateur
2. Utiliser un logiciel de sauvegarde ou synchronisation qui copie tous les nouveaux fichiers et dossiers de mon arborescence miroir vers mon disque dur externe


1. Est-ce qu'une ligne de commande comme celle-ci est un bon départ ?

find /mondisquedurexterne -type d -exec cp "{}" /home/julien/Arborescencemiroir

J'ai l'impression qu'il manque un argument dans cp indiquant le type à copier comme dans find. Un argument qui dirait seulement le "-type d", mais je n'ai rien trouvé dans cp
Merci de vérifier ma synthaxe, particulièrement si j'ai pas de barres obliques manquantes ou de trop

J'ai trouvé cette commande aussi :

find * -type d -exec mkdir /home/korben/copie/\{\} \

http://korben.info/copier-la-structure- … hiers.html
Je comprend pas les 3 barres obliques (qui pointent vers la gauche) à la fin de la commande

Je pourrais l'écrire comme suit :

find /mondisquedurexterne -type d -exec mkdir /home/julien/Arborescencemiroir\{\} \

2. Pour la sauvegarde, est-ce que je dois sélectionner une option particulière ? Genre "seulement les nouveaux documents" ? Ou Ils vont automatiquement copier les nouveaux documents ?
Hum... je viens de réaliser un point... Est-ce que les logiciels de sauvegarde incrémentale font une genre de synchronisation unidirectionnelle et enregistre sous forme d'un répertoire et ses fichiers ? Ou bien est-ce enregistrer sous un format protégé qui n'est pas lisible, mais seulement utilisable pour restaurer ?
Car si c'est la 2e option, donc un format illisble, je serais mieux d'utiliser un logiciel de synchronisation. Est-ce possible de faire une synchronisation unidirectionnelle ? Je pensais utiliser FreeFileSync... Dans Configuration, je crois que ce qui me conviendrait serait "Mise à jour". Ça dit : "Copier les fichiers nouveaux ou mis à jour dans le dossier de droite."


Je suis débutant et ne fais que du copier-coller de terminal d'habitude, alors merci d'utiliser un language compréhensible smile

Merci pour votre aide !

Julien

Dernière modification par julien.drouin.b (Le 04/12/2014, à 21:56)

Hors ligne

#11 Le 04/12/2014, à 22:08

julien.drouin.b

Re : Copier une arborescence de dossier sans les fichiers

J'ai trouvé cet autre exemple :

If you want to mirror a directory skeleton and copy no files:

find -type d -links 2 -exec mkdir -p "/path/to/backup/{}" \;

What's going on here:

    Find is only selecting directories
    We're using -links 2 to find the deepest possible directories.
    mkdir -p will make any missing directories along the way.

I've done it like this rather than find -type d -exec mkdir -p "/path/to/backup/{}" \; because it'll cut out on a whole buttload of mkdir calls.

http://askubuntu.com/questions/365877/c … -not-files

Est-ce que -links 2 et -p (dans mkdir) sont vraiment nécessaires ?

Hors ligne

#12 Le 20/04/2015, à 12:03

gloox

Re : Copier une arborescence de dossier sans les fichiers

je propose ceci

mkdir RepertoireCible

find RepertoireSource  -type d | cpio -pvd RepertoireCible

Hors ligne