Forum Linux.debian/ubuntu Copier une arborescence de dossiers sans les fichiers avec CP

Posté par  . Licence CC By‑SA.
Étiquettes :
4
30
juil.
2023

Bonjour à tous,
Je souhaite utiliser la commande cp sur Linux Mint pour copier une arborescence de dossiers (Disque A) vers un emplacement (Disque B) mais sans les fichiers à l’intérieur et si possible avec une limite de niveau (facultatif),
Cette arborescence est dans une partition Brtfs
j’ai déjà essayé XCOPY sous Windows aprés avoir trouvé un tuto mais vu que j’ai des noms de dossiers de plus de 255 caractères et des caractères spéciaux, j’ai l’erreur « Mémoire insuffisante » qui stoppe la commande.( cette arborescence à été créée sous Linux)
Je voudrais essayer cp mais malgré des recherches sur ses fonctions je n’ai pas trouvé d’informations claires sur la commande que je dois lancer.
J’ai vérifié aussi du coté des Applications mais rien (Teracopy /et autres n’incluent pas cette possibilité)

D’ailleurs si il existe une autre commande Linux me permettant de le faire, ça me va aussi.

Merci

  • # En juillet ?

    Posté par  . Évalué à 3.

    Si on n'était pas en juillet, je dirais qu'on a à faire à un étudiant qui a un devoir à rendre !

    Bon, une piste : je le ferais en deux commandes, une pour rechercher les répertoires, l'autre pour les créer, le tout enrobé, boucle pour parer au problème du grand nombre de répertoires, pour arriver à ce qu'on nomme parfois un "one liner". On peut faire sans boucle, mais comme rien n'est magique, on risque de dépasser la limite de paramètres à une commande.

    Question aux vieux cons comme moi : à propos de one liner, y'en a qui ont connu les deuxlignes et les GFA-Punch ?…
    Message perso : j'en profite si Zoch traîne par ici, lui qui en a écrit une paire de GFA-Punch, tu pourrais donner quelques nouvelles, depuis les 20 - 25 ans qu'on s'est pas vu !

    • [^] # Re: En juillet ?

      Posté par  . Évalué à 3.

      on risque de dépasser la limite de paramètres à une commande.

      Pour ce genre de cas, connais-tu xargs -n ?

      • [^] # Re: En juillet ?

        Posté par  . Évalué à 1.

        Oui, mais même xargs a ses limites il me semble. Honnêtement, ça fait très longtemps que je ne l'ai plus utilisée, je ne me rappelle plus ce qui m'avait rebuté.
        Il faudra que je lui redonne sa chance !

        Ceci dit, je viens de jeter un œil vite fait, et je n'ai pas trouvé la limite en nombre de caractères / paramètres à une commande. Rien du côté de ulimit.

  • # Soluce ?

    Posté par  . Évalué à 6. Dernière modification le 30 juillet 2023 à 23:31.

    Un truc du genre. Pas tester, à adapter au besoin (attention ça peut être violent, faire d’abord sans le exec pour vérifier la liste… et assure toi de comprendre ce que tu fais via la lecture attentive du man)

    cd $source
    find . -type d [-maxdepth N] -exec mkdir -p $destination/'{}' \;
    

    Ce n’est pas une véritable copie, dans le sens où ça ne conserve pas les droits, les propriétaires, etc. Si ça suffit, tant mieux. Sinon, j’ai bien pensé à rsync (seul?!) ou une combinaison de find et rsync au pire, dans le même esprit, mais va falloir se taper les pages de man…

    • [^] # Re: Soluce ?

      Posté par  . Évalué à 3.

      Pour copier les permissions vers la nouvelle arborescence. tu peux utiliser getfacl.

      A la racine des dossiers à copier:
      getfacl -R ./ > sauvegarde_permissions

      Puis tu copie le fichier sauvegarde_permissions à la racine de ta nouvelle arboressence et:
      setfacl --restore=sauvegarde_permissions 2> /dev/null

      • [^] # Re: Soluce ?

        Posté par  . Évalué à 2.

        Merci beaucoup, ce ne sera pas utile pour ce cas ci mais je garde cette commande sous la main

  • # Rsync

    Posté par  . Évalué à 4.

    rsync est cité dans une réponse précédente, mais sans plus d'explication. Après la lecture de la page de manuel, voici une commande qui devrait fonctionner :

    rsync --recursive --min-size=8192P-1 <SOURCE>/ <DESTINATION>/ --verbose --progress

    À moins que tu n'aies des fichiers de plus de 8192 Péta-octets sur ton arborescence, ça devrait fonctionner. Ajoute néanmoins l'option --dry-run la première fois pour t'assurer que tout ira bien, et après vogue la galère !

    Il est même possible de bricoler une limite au niveau de récursion avec l'option --exclude=/*/*/*/etc en mettant autant de */ que nécessaire. Un seul ne copiera que le dossier source, deux copieront le dossier source avec ses dossiers, trois avec en plus les sous-dossiers de ses dossiers, etc. Mais la prudence reste de mise, cette option pouvant totalement cafouiller si les fichiers ont des noms contenants des /.

    Une deuxième possibilité, plus sûre, mais qui ne permet pas de limiter la récursion est :

    rsync --recursive --include=/**/ --exclude=/** <SOURCE>/ <DESTINATION>/ --verbose --progress

    Pour vérifier que tout est bien copié, observe la sortie de la commande ou utilise la commande :

    tree <DESTINATION>

    Il y a 10 sortes de gens dans le monde – ceux qui comprennent le ternaire, ceux qui ne le comprennent pas et ceux qui le confondent avec le binaire.

    • [^] # Re: Rsync

      Posté par  . Évalué à 2.

      Mais la prudence reste de mise, cette option pouvant totalement cafouiller si les fichiers ont des noms contenants des /.

      Ne jamais tester tester rsync sans l'option '--dry-run' ou '-n' (effectue un essai sans apporter de modifications). L'option '--verbose' ou '-v' peut être utile

    • [^] # Re: Rsync

      Posté par  . Évalué à 1. Dernière modification le 31 juillet 2023 à 19:03.

      Merci pour cette piste, aprés avoir lu les réponses j'en déduit qu'il n'existe pas d'opérateur à cp pour exclure automatiaquement les fichiers dans une copie récursive, ce qui confirme mes recerches.
      Je dois dupliquer une arborescence de dossier d'un disque dur de 8TO (plein !), rsync me parait pas mal en effet.
      je vais lancer en dry-run pour voir.
      merci

      • [^] # Re: Rsync

        Posté par  . Évalué à 4.

        PS : j'ai lancé : rsync --recursive --min-size=8192P-1 /media/jeremy/d8ddff72-49c7-4060-a10b-70123c4074d9 /media/jeremy/18dd994c-3e65-47f8-91d6-8dc7cf3b5828/ARCH --verbose --progress --dry-run

        Sortie :
        sending incremental file list

        listing des fichiers puis :

        sent 12.986.897 bytes received 62.340 bytes 41.757,56 bytes/sec
        total size is 7.897.021.415.775 speedup is 605.171,12 (DRY RUN)

        j'ai relancé en réel et c'est bon, les 20 000 dossiers de l'arborescence ont été copiés en 3s ! puissant ce Rsync
        le Topic est clos, merci encore pour votre réactivité.

  • # find + pax

    Posté par  (site web personnel) . Évalué à 3. Dernière modification le 01 août 2023 à 14:57.

    On peut trouver les répertoires avec find -type d. Et pax, qui est un outil qui se veut unificateur de tar et cpio, dispose d'un mode où il ne crée pas d'archive, ne lit pas d'archive, n'extrait pas d'archive mais copie des fichiers. Et quand on ne lui donne pas de liste de ces fichiers, il la prend sur son entrée standard. Je vous laisse coller les morceaux.

Suivre le flux des commentaires

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