Forum Linux.débutant Aide commande FIND et copier les résultats.

Posté par . Licence CC by-sa
1
26
sept.
2015

Bonjour à tous.

D'abord je veux m'excuser car je suis pas francophone donc peut-être je vais faire des fautes grammaticales.

J'ai un netbook avec Xubuntu. J'ai utilisé un outil de recovery pour récuperer des donnés efacés du disque dur (des photos) Le problème c'est que le resultat c'est des milieurs de dosiers avec des images de tout genre.

J'ai utilisé le commande FIND pour seleccioner les .jpg de la façon suivante:

find /home/diego/Imágenes/ -iname "*.jpg"

Maintenant il me montre la routes des images mais je voudrais les selectioner et les copier toutes dans une autre dossier, mais j'ai aucune idée de comment le faire. Est-ce que qulqu'un pourrait m'aider?

Merci beaucoup.

  • # 3 suites

    Posté par (page perso) . Évalué à 3. Dernière modification le 27/09/15 à 11:58.

    Bonjour,

    Il y a au moins trois méthodes différentes.

    find /home/diego/Imágenes/ -iname "*.jpg" | xargs mv ....
    find /home/diego/Imágenes/ -iname "*.jpg" | while read F ; do  mv $F ; done
    find /home/diego/Imágenes/ -iname "*.jpg" -exec mv {} \;

    Par contre, j'ai toujours utilisé l'une ou l'autre de ces méthode avec des commandes nécessitant qu'un seul argument… alors dans le cas d'un mv je ne sais pas comment tu vas faire, mais il n'y a pas de raisons que tu n'y arrives pas.

    Fais l'essai depuis un autre dossier avec un échantillon d'images.

    L'une ou l'autre des méthode peut poser un problème de mémoire si la liste des fichiers à traiter est particulièrement longue.

    As-tu essayé testdisk, pour récupérer tes fichiers?

    Bon courage

    • [^] # Re: 3 suites

      Posté par . Évalué à 3. Dernière modification le 26/09/15 à 15:56.

      La 3eme commande me semble la plus simple + si besoin ajouter des guillemets autour de {} pour gérer les répertoires/fichiers avec des espaces.

      Ce qui donne

      mkdir -p /home/diego/images && find /home/diego/Imágenes/ -iname "*.jpg" -exec cp "{}" /home/diego/images \;

      cdlt

      • [^] # Re: 3 suites

        Posté par . Évalué à 2.

        Et puis le cp est plus sûr que le mv aussi.
        Je le note.

        Julien_c'est_bien (y'a pas que Seb)

    • [^] # Re: 3 suites

      Posté par . Évalué à 1.

      Salut Grégoire,

      Avec la commande
      find /home/diego/Imágenes/ -iname "*.jpg" | while read F ; do mv $F ; done

      Que tu as donné il ne serait pas possible de générer un nombre incrémenté à l'étape do mv $F du type do mv nbincrementé$F

      Par ailleurs, le fichier F il est copié où avec cette commande ?

      Julien_c'est_bien (y'a pas que Seb)

    • [^] # Re: 3 suites

      Posté par (page perso) . Évalué à 4.

      Je pense que xargs sera plus rapide que -exec. Par contre lorsqu'on récupère des données, il vaut mieux éviter de les reperdre. Je conseille donc une copie plutôt qu'on déplacement. Tu peux faire ça avec rsync

      rsync -avn --include='*.jpg' --include='*.JPG' --exclude='*' /home/diego/Imágenes/ /desitnation/ 
      
      

      Avec le -n rsync ne fait rien (dry-run) il faut l'enlever lorsque la commande fait ce que tu souhaites.

  • # Option -exec

    Posté par . Évalué à 1.

    Bonjour Buhako

    Tu peux utiliser l'option -exec pour lui faire exécuter un move sur le résultat de la commande find
    Il faut que tu crées le répertoire "tri" avant de lancer la commande.
    le caractère ; indique à find que la commande est finie et le caractère \ permet d'échapper le ;
    find /home/diego/Imágenes/ -iname "*.jpg" -exec mv {} /home/diego/tri \;

    fait tout de même un test en procédant comme ça :
    copie manuellement les 100 premiers fichiers de /home/diego/Imágenes/ dans un répertoire /home/diego/Test et lance la commande sur ce répertoire :
    find /home/diego/Test/ -iname "*.jpg" -exec mv {} /home/diego/Test \;
    Vérifies que ça fait bien ce que tu veux.

    Attention, si tu as des fichiers qui ont le même nom, ils seront écrasés.
    exemple find trouve /dossier1/fichier1 et le copie dans /home/diego/tri puis find trouve /dossier2/fichier1 et le copie dans /home/diego/tri en écrasant le fichier précédent.

    Julien_c'est_bien (y'a pas que Seb)

  • # 1er essai

    Posté par . Évalué à 1.

    Merci pour la réponse.

    J'ai essaié de la façon suivante :

    find /home/diego/Imágenes/ -iname "*.jpg" -exec mv -t /home/diego/Documentos/ {} +

    Resultat --> Seulement 4 photos ont été copiés. Pour le reste j'obtiens un message : on peut pas bouger xxxxxx à yyyyyy. Permis refusé.

    J'ai essaie avec sudo mais rien se passe.

    Je suis très noob donc je suis sur je fais quelque chose mal.

    Merci à nouveau.

    • [^] # Re: 1er essai

      Posté par . Évalué à 2. Dernière modification le 26/09/15 à 16:25.

      Buhako,

      Il faut regarder qui est le propriétaire de ces fichiers en faisant un ls -lh

      Si tu vois que le propriétaire est un autre utilisateur que toi, alors fait un sudo chown diego.diego -R *.jpg voir un sudo chown diego.diego -R *.JPG

      Julien_c'est_bien (y'a pas que Seb)

    • [^] # Re: 1er essai

      Posté par . Évalué à 2.

      Faire un "cp" pour copier au lieu de "mv".

  • # Pour renommer tes photos

    Posté par . Évalué à 3.

    Quand je classes mes photos/vidéos pour ne pas avoir de problèmes de noms de fichiers identiques, je les renommes par date de créations.
    Je me suis fabriqué ce "script" qui extrait les données exif puis les mets en forme (et créé des fichiers txt pour chaque étapes)
    Il faut installer exif programme en ligne de commande pour extraire les données exif des photos et pyrenamer programme avec interface graphique qui permet de renommer en masse.

    En se plaçant dans le répertoire ou se trouvent les photos

    • Extrait les données exif exif *.JPG > ../0data.txt

    ici un extrait du fichier 0data.txt que j'obtiens avec la commande précédente.

    Marqueurs EXIF dans'P1010989.JPG' (ordre des octets 'Intel') :
    --------------------+----------------------------------------------------------
    Marqueur |Valeur
    --------------------+----------------------------------------------------------
    Fabricant |Panasonic
    Modèle |DMC-FZ38
    Date et heure |2014:09:28 18:57:49
    Version d'exif |Version d'exif 2.21
    Date and Time (Origi|2014:09:28 09:13:42
    Date and Time (Digit|2014:09:28 09:13:42
    Components Configura|Y Cb Cr -
    --------------------+----------------------------------------------------------
    Les données EXIF contiennent une vignette (7157 octets).
    Marqueurs EXIF dans'P1010990.JPG' (ordre des octets 'Intel') :
    --------------------+----------------------------------------------------------
    Marqueur |Valeur
    --------------------+----------------------------------------------------------
    Fabricant |Panasonic
    Modèle |DMC-FZ38
    Date et heure |2014:09:28 10:02:12
    Version d'exif |Version d'exif 2.21
    Date and Time (Origi|2014:09:28 10:02:12
    Date and Time (Digit|2014:09:28 10:02:12
    Components Configura|Y Cb Cr -
    --------------------+----------------------------------------------------------
    Les données EXIF contiennent une vignette (5945 octets).
    Marqueurs EXIF dans'P1010991.JPG' (ordre des octets 'Intel') :
    --------------------+----------------------------------------------------------
    Marqueur |Valeur
    --------------------+----------------------------------------------------------
    Fabricant |Panasonic
    Modèle |DMC-FZ38
    Date et heure |2014:09:28 11:28:09
    Version d'exif |Version d'exif 2.21
    Date and Time (Origi|2014:09:28 11:28:09
    Date and Time (Digit|2014:09:28 11:28:09
    Components Configura|Y Cb Cr -
    --------------------+----------------------------------------------------------

    • Récupère les dates de prises de vues (< "charge" le fichier ../0data.txt)
      <../0data.txt | grep "Date and Time (Origi" > ../0rename0.txt

    • Remplace une chaîne de caractère (ici Date and Time (Origi| par rien)
      sed 's/Date and Time (Origi|//' ../0rename0.txt > ../0rename1.txt

    • Remplace les : par des -
      sed 's/:/-/'g ../0rename1.txt > ../0rename2.txt

    • Remplace les par des _
      sed 's/ /_/'g ../0rename2.txt > ../0rename3.txt

    • Remplace le 14 ème caractère par h (ici 2014-09-28_12-49-02 devient 2014-09-28_12h49-02)
      sed -r 's/(.{13}).(.*)/\1h\2/' ../0rename3.tx ../0rename4.txt

      • Explications
      • partie gauche de la commande
        • (.{13}) désigne les 13 premiers caractères
        • . désigne le 14 ème caractère
        • (.*) désigne la suite de l'expression
      • partie droite de la commande
        • \1 reprends la chaîne de caractères désignée par (.{13})
        • h remplace .
        • \2 reprends la chaîne de caractères (.*)
    • Remplace le 17 ème caractère par m (ici 2014-09-28_12h49-02 devient 2014-09-28_12h49m02)
      sed -r 's/(.{16}).(.*)/\1m\2/' ../0rename4.txt > ../0rename5.txt

    Tu peux directement copier-coller dans le terminal toutes les commandes d'un coup :

    exif .JPG > ../0data.txt
    < ../0data.txt | grep "Date and Time (Origi" > ../0rename0.txt
    sed 's/Date and Time (Origi|//' ../0rename0.txt > ../0rename1.txt
    sed 's/:/-/'g ../0rename1.txt > ../0rename2.txt
    sed 's/ /_/'g ../0rename2.txt > ../0rename3.txt
    sed -r 's/(.{13}).(.
    )/\1h\2/' ../0rename3.tx ../0rename4.txt
    sed -r 's/(.{16}).(.*)/\1m\2/' ../0rename4.txt > ../0rename5.txt

    Ensuite après avoir vérifié que le fichier ../0rename5.txt est cohérent, je l'utilises dans pyrenammer avec le menu "fichier/charger les noms depuis un fichier"

    Julien_c'est_bien (y'a pas que Seb)

  • # Langue

    Posté par (page perso) . Évalué à 5.

    Pour un non francophone, tu te débrouilles bien :-)

    Une question non technique : qu'est ce qui fait que tu poses ta question ici, plutôt que sur un forum dans ta langue, ou un forum « général » comme http://superuser.com/ ou http://unix.stackexchange.com/ ?

    • [^] # Re: Langue

      Posté par . Évalué à 2.

      Linuxfr

    • [^] # Re: Langue

      Posté par . Évalué à 1.

      J'ai tapé forum linux sur Google, et comment k'ai configuré Google en français c'etait le prémier résultat. Comme ça je profite pour pratique mon écriture ;)

  • # Résolu

    Posté par . Évalué à 1.

    Finalement les fichiers se sont bien deplacés.

    Merci à tous pour vôtre aide et vôtre gentillese.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.