Déplacer des fichiers de dossiers (unix)

muqaddarmuqaddar Administrateur
octobre 2011 modifié dans Xcode et Developer Tools #1
Coucou,

Un peu d'unix aujourd'hui... car je suis loin d'être un expert de la ligne de commande.

Je voudrais parcourir un dossier qui contient 100 dossiers.
Chacun de ces dossiers contient un répertoire "big" qui contient une image lambda.

Je veux récupérer chacune des images de tous les répertoires "big" et les exporter vers un seul autre dossier.

Ce qui donne :

logo/dossier-x/big/image-u
logo/dossier-y/big/image-v
logo/dossier-z/big/image-t
...etc

à  mettre dans le dossier "images" :
image-u
image-v
image-t
...

On doit pouvoir le faire avec automator mais je n'y arrive pas (et puis une ligne de commande c'est plus pratique).

Réponses

  • AliGatorAliGator Membre, Modérateur
    décembre 2010 modifié #2
    Tout simplement une boucle en utilisant "*" pour parcourir tous les dossiers d'un coup :
    for i in logo/*/big/*; do mv "$i" images; done;
    

    "logo/*/big/*" se lit en gros : "tous les fichiers se trouvant dans le dossier big se trouvant dans n'importe quel dossier se trouvant dans le dossier logo". Pour chacun de ces fichiers, on exécute la commande "mv" pour déplacer le fichier, et basta.

    Astuce : si tu veux vérifier avant d'exécuter, tu peux mettre un "echo" devant le "mv", pour qu'il t'affiche les commandes qu'il va exécuter et que les vérifies...
  • muqaddarmuqaddar Administrateur
    23:02 modifié #3
    Wouah !
    ça marche du feu de dieu !  :o

    Un grand merci !
  • muqaddarmuqaddar Administrateur
    23:02 modifié #4
    Hello,

    Aujourd'hui je veux copier une série de fichiers de dossiers d'un répertoire à  l'autre.
    J'ai essayé plusieurs choses mais je sèche.

    J'ai des images ici:

    article/image/*/thumb/* <br />
    


    que je veux mettre ici:

    article/image/*/medium/*<br />
    


    or, "medium" n'existe pas, il faut que je le crée...

    Donc j'ai essayé un truc comme ça pour commencer :

    for i in article/image/*; do mkdir &quot;article/image/*/medium&quot;; done;<br />
    


    Mais ça ne marche pas. De l'aide !
  • AliGatorAliGator Membre, Modérateur
    23:02 modifié #5
    $i à  la place de l'étoile dans ton mkdir.
  • muqaddarmuqaddar Administrateur
    23:02 modifié #6
    dans 1318356036:

    $i à  la place de l'étoile dans ton mkdir.


    J'ai ça:

    muqaddar:upload muqaddar$ for i in article/image/*/; do mkdir &quot;article/image/$i/medium&quot;; done;<br />mkdir: article/image/article/image/1: No such file or directory<br />mkdir: article/image/article/image/16: No such file or directory<br />mkdir: article/image/article/image/17: No such file or directory<br />mkdir: article/image/article/image/19: No such file or directory<br />mkdir: article/image/article/image/20: No such file or directory<br />mkdir: article/image/article/image/5: No such file or directory<br />mkdir: article/image/article/image/7: No such file or directory<br />mkdir: article/image/article/image/9: No such file or directory<br />mkdir: article/image/article/image/tmp: No such file or directory
    


    Pourtant, les dossiers sont bien là .

    Idéalement, il faudrait que je fasse ça en 1 ligne.

    for i in article/image/*/; do mkdir &quot;article/image/$i/medium&quot;; do mv &quot;$i&quot; &quot;article/image/*/medium/$i&quot;; done;
    

  • muqaddarmuqaddar Administrateur
    23:02 modifié #7
    Il faudrait faire ça, sachant que "medium" n'existe pas encore.
    Comment forcer sa création ?

    for i in article/image/*/thumb/*; do mv &quot;$i&quot; &quot;article/image/*/medium/$i&quot;; done;
    
  • AliGatorAliGator Membre, Modérateur
    23:02 modifié #8
    Je comprend pas ton utilisation de l'etoile dans le paramètre indiquant la destination, que ce soit pour mkdir ou pour mv. "*" permet de sélectionner une liste de fichiers existants, comment veux-tu qu'il se débrouille si tu lui mets une étoile dans un chemin de dossiers qui n'existe même pas encore, ça n'a pas de sens ?!

    Et sinon quel est le problème de faire le mkdir et le mv entre ton "do" et ton "done" ?!
    Sinon regarde les options de mkdir et de mv pour créer les dossiers intermédiaires qui n'existent pas
  • muqaddarmuqaddar Administrateur
    23:02 modifié #9
    Ouais. Bon, ça me dépasse un peu. J'ai plusieurs niveaux de dossiers imbriqués.
    J'ai craqué.  ??? Du coup, je l'ai fait en ruby en 3 minutes... Désolé pour le dérangement. o:)
  • LeChatNoirLeChatNoir Membre, Modérateur
    23:02 modifié #10
    I like Unix alors je pouvais pas laisser un post comme ça sans répondre  :)

    Voilà  ce qu'il faut faire (enfin, une solution, y en a surement plein d'autres...)
    <br />for i in article/image/*/thumb/*<br />do<br />newpath=$(echo $i|sed s/thumb/medium/)<br />mkdir -p $newpath<br />mv $i $newpath<br />done<br />
    


    Ca m'a pris 2mn30. Na  :P
  • muqaddarmuqaddar Administrateur
    23:02 modifié #11
    Je ne comprends pas pourquoi thumb et medium sont à  la suite dans newpath alors qu'ils sont sensés être au même niveau ?
  • zoczoc Membre
    23:02 modifié #12
    ils ne sont pas à  la suite ;)


    ce sont des paramètres de la commande sed. En l'occurrence, "s/thumb/medium/" demande à  sed de remplacer (s=substitute) thumb par medium dans le texte qu'il reçoit sur son entrée standard...


    Ah la la, le bash c'est pourtant simple et bien utile... Perso j'adore.

  • muqaddarmuqaddar Administrateur
    23:02 modifié #13
    Le sujet a été tronqué.

    La suite sur le site ici:
    http://pommedev.mediabox.fr/developer-tools/re-deplacer-des-fichiers-de-dossiers-(unix)/msg78476/?topicseen#new
Connectez-vous ou Inscrivez-vous pour répondre.