IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

copie avec filtre sur le repertoire


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Par défaut copie avec filtre sur le repertoire
    Bonjour,
    Je voudrais faire une copie d'un repertoire avec tous les sous repertoire sauf certain ou je mettrais le nom en parametre

    J'ai trouvé ca sur le forum pour faire la meme chose mais avec un filtre pour les nom de fichier
    exemple avec les fichier php seulement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name '*.php' | xargs -i cp --parents {} repert_cible
    et une expression reguliere qui verifie qu'il n y a pas la sous chaine "img" par ex:
    mais celle ci ne fonctionne pas lorsque je la remplace dans le nom de fichier de l'expression precedente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name '^(?:(?!img).)*$' | xargs -i cp --parents {} repert_cible
    Un autre exemple qui ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ls !(file*)
    cache intro.doc
     
    indique à l'interpreteur de lister tous les fichiers dont le nom de commence pas par file*.
    source

    Pour info j utilise winscp pour envoyer les commandes et la distribution est gentoo


    Merci

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par takoha Voir le message
    Bonjour,
    Je voudrais faire une copie d'un repertoire avec tous les sous repertoire sauf certain ou je mettrais le nom en parametre
    Le principal problème dans ta manip, c'est qu'un répertoire c'est un fichier qui contient d'autres fichiers.
    Donc si tu veux copier un répertoire entier, pas de problème. Tu copies le répertoire et tout ce qui s'y trouve sera copié.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    toto
    |____titi
    |____tata
    |      |____tata1
    |      |____tata2
    |____tutu
    Copier toto entrainera la création des éléments (répertoire ou fichier peu importe) titi, tata (avec ses sous-éléments tata1 et tata2) et tutu.

    A l'inverse, si tu ne veux pas tutu, alors tu ne peux plus faire "cp toto dest". Il te faut
    1) créer le répertoire cible
    2) copier un à un toto/titi et toto/tata dans le répertoire cible

    Mais maintenant, tu veux toto/titi et toto/tata mais pas toto/tata/tata1. Le problème recommence. Tu peux copier titi mais tu ne peux plus copier tata. Il te faut refaire la même manip pour ce sous-dossier...

    Une solution de facilité sera de copier tout ton répertoire puis de supprimer ensuite les sous-dossiers que tu ne veux pas...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Par défaut
    Merci pour la reponse rapide

    A l'inverse, si tu ne veux pas tutu, alors tu ne peux plus faire "cp toto dest". Il te faut
    1) créer le répertoire cible
    2) copier un à un toto/titi et toto/tata dans le répertoire cible

    Mais maintenant, tu veux toto/titi et toto/tata mais pas toto/tata/tata1. Le problème recommence. Tu peux copier titi mais tu ne peux plus copier tata. Il te faut refaire la même manip pour ce sous-dossier...
    Oui mais ca je sais pas le faire en shell justement

    Une solution de facilité sera de copier tout ton répertoire puis de supprimer ensuite les sous-dossiers que tu ne veux pas...
    Le probleme en fait, c'est que les rep que je veux pas copier sont des gros dossier (>1Go), c'est la raison pour laquelle je voudrais inserer le filtre directement dans la cmd.

    L'ideal serait de pouvoir inserer dans l expression reguliere du nom de fichier, ca fonctionne pour verifier une chaine mais pas pour en exclure :S

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par takoha Voir le message
    Oui mais ca je sais pas le faire en shell justement
    Bah, c'est pas très difficile quand on travaille en récursif.
    Par exemple cette fonction "copy" correspond à ton besoin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #!/bin/sh
     
    copy()
    {
    	# Si la source est un fichier
    	if test -f "$1"
    	then
    		cp "$1" "$2"
    		return
    	fi
     
    	# Si la source est un répertoire
    	if test -d "$1"
    	then
    		# Récupération source et dest
    		local source="$1"
    		local dest="$2"
     
    		# On élimine ces 2 paramètres - Il reste la liste d'exclusion
    		shift 2
     
    		# Création répertoire cible
    		mkdir "$dest"
    		ls "$source" |while read file
    		do
    			# Vérification fichier non présent dans liste exclusion
    			unset flag
    			for excl in $*
    			do
    				if test "$source/$file" = "$excl"
    				then
    					# Ce fichier est dans la liste - Il ne sera pas copié
    					local flag="true"
    					break
    				fi
    			done
     
    			# Variable flag non-remplie => fichier autorisé
    			# Appel récursif avec tous les paramètres
    			test -z "$flag" && copy "$source/$file" "$dest/$file" $*
    		done
    	fi
    }
     
    # Test
    source=$1
    dest=$2
    shift 2
     
    # Effacement répertoire cible
    rm -fr "$dest"
     
    # Test fonction
    copy "$source" "$dest" $*
    Ensuite, j'ai créé l'arborescence suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    aaa
    |-- titi
    |   |-- group
    |   `-- passwd
    |-- toto
    |   |-- group
    |   `-- passwd
    `-- tutu
        |-- group
        `-- passwd
    Puis j'ai lancé mon script en lui passant en paramètre
    "aaa" "bbb" "aaa/toto" "aaa/titi/group"
    (les 2 premiers noms "aaa" et "bbb" étant la source et la destination, et les autres "aaa/toto" et "aaa/titi/group" étant les éléments à ne pas copier)

    Il m'a créé l'arborescence suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bbb
    |-- titi
    |   `-- passwd
    `-- tutu
        |-- group
        `-- passwd
    Ce qui correspond parfaitement au but à atteindre pour mon essai (tout aaa sauf aaa/toto et aaa/titi/group)

    Attention, la fonction n'est pas parfaite. Par exemple elle ne gère pas les liens symboliques ni les droits d'origine. Mais tu vois déjà l'idée...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 23
    Par défaut
    Merci svear!!
    avec les commentaires en plus
    Pour les liens symboliques c'est pas un soucis pour l utilisation que j'en fait, ni pour les droit je doit les changer apres de tte facon

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par takoha Voir le message
    Merci svear!!
    avec les commentaires en plus
    Ouais. Un minimum quoi

    Citation Envoyé par takoha Voir le message
    Pour les liens symboliques c'est pas un soucis pour l utilisation que j'en fait, ni pour les droit je doit les changer apres de tte facon
    Oui. Mais si dans toto il y a un lien symbolique vers "../../aaa", le script part en torche.

    A la limite, remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test -f "$1" -a ! -L "$1"
    et idem pour le test -d
    Ca ne recréera pas les liens symboliques dans le dossier de destination mais ça évitera le mode "berserk"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Problème avec filtre sur filtre
    Par barbapapa2 dans le forum IHM
    Réponses: 5
    Dernier message: 25/10/2008, 11h14
  2. [SQL - Oracle 9i] Requete Sql avec filtre sur critere
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 05/12/2007, 08h45
  3. requete avec filtre sur la date
    Par petitours dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 12/02/2007, 11h49
  4. [BO]prompt avec filtre sur les valeurs proposées
    Par arnauann dans le forum Deski
    Réponses: 3
    Dernier message: 30/11/2006, 17h00
  5. Requete avec filtre sur un champ
    Par podz dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/02/2005, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo