Forum Programmation.shell Copier tous les fichiers d'une arborescence dans un même répertoire

Posté par  .
Étiquettes :
2
5
juil.
2012

Salut,

J'ai un tas de fichiers texte dans une arborescence, et je voudrais les copier
tous dans un même répertoire de destination, comme ceci:

content/foo.txt           ->      $DEST/foo.txt
content/bar.md            ->      $DEST/bar.md
content/baz/quux.html     ->      $DEST/quux.html
content/baz/foobar.rst    ->      $DEST/foobar.rst
... etc ...

J'ai essayé de faire comme ceci:

find content/ -exec cp -v {} $DEST/`basename {}` ';'

Mais bien entendu, ça n'a pas marché, puisque c'est le shell qui interprétait la
commande basename et pas find …

J'ai aussi regardé dans le manuel de cp, mais je n'ai pas trouvé d'options
pour ça …

Quelqu'un a une idée ?

Merci d'avance ;-)

  • # simple

    Posté par  . Évalué à 8.

    find content/ -exec cp -v {} $DEST \;
    
    

    Sans utiliser find (avec zsh ou bash) :

    cp content/**/* $DEST
    # variante pour zsh pour ne sélectionner que les fichiers et non les dossiers/liens symboliques/etc.
    cp content/**/*(.) $DEST
    
    
    • [^] # Re: simple

      Posté par  . Évalué à 1.

      Oui, ça marche!

      Merci :-)

      Envoyé depuis ma Debian avec Firefox

  • # for ?

    Posté par  . Évalué à 1.

    for FILE in `find content/` ; do cp -v $FILE $DEST/`basename $i`;done
    
    
    • [^] # Re: for ?

      Posté par  . Évalué à 2. Dernière modification le 05 juillet 2012 à 18:26.

      Cela ne gère pas les noms de fichiers contenant des espaces, dès le for FILE in `find...`.

      • [^] # Re: for ?

        Posté par  . Évalué à 2.

        Chez moi ça fonctionne, mais effectivement, problème récurent avec le for.
        sinon, une chose comme ça devrait faire l'affaire (je ne l'ai pas vérifié).

        OLDFS=$FS ; FS="\n" ; for FILE in `find content/` ; do cp -v $FILE $DEST/`basename $i`;done ; FS=$OLDFS
        
        
        • [^] # Re: for ?

          Posté par  . Évalué à 2.

          Vous devez parler de la variable IFS. Cela échouera encore avec les noms de fichiers contenant des retours à la ligne mais ils sont plus rares.
          Si l'on veut conserver la boucle for et la commande find, il faut utiliser le caractère nul comme séparateur sûr.

    • [^] # Re: for ?

      Posté par  . Évalué à 1.

      find content/ -type f | while read f; cp -v "$f" "${f##*/}"; done
      
      

      On peut sans doute faire une variante à base de -print0 et de xargs mais j'aime bien le while.

  • # Tout simplement

    Posté par  . Évalué à -7. Dernière modification le 05 juillet 2012 à 18:19.

    for i in $(ls -1 content/); do cp $i DEST/; done

Suivre le flux des commentaires

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