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

Posté par .
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/07/12 à 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/07/12 à 18:19.

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

Suivre le flux des commentaires

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