Forum Linux.débutant MV de tout les fichiers et sous dossier ayant moins de une semaine

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
3
nov.
2017

Bonjour,

Je galère un peu avec la commande mv

Je voudrais faire déplacer tous les fichiers & dossiers de plus de une semaine en conservant l'arborescence dans un autre dossier.

J'imagine que je dois combiner un find et la commande mv mais je tourne en rond là

Merci pour votre aide

Jerry

  • # Pas que find

    Posté par  (site web personnel) . Évalué à 5.

    Il te faudra aussi utiliser la commande man.
    Par exemple : man find

    Quand tu auras trouvé tes fichiers, tu pourras ajouter -exec.

    Bonne lecture.

    Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html

    • [^] # Re: Pas que find

      Posté par  . Évalué à -1.

      Merci de ton aide Grégoire G

      J'imagine que tu ne comprends pas l'aide sollicité à des experts …
      Dommage qu'il n'existe pas de commande pour rendre ton commentaire plus constructif et/ou agréable.

      bat

      • [^] # Re: Pas que find

        Posté par  . Évalué à 3.

        Est-ce que tu as fait un man find avant de répondre de manière aussi discourtoise…?
        La page de manuel te donne suffisamment d'information et Grégoire G t'oriente même vers la sous-commande utile.

        Fais un minimum d'effort quand même !

        • [^] # Re: Pas que find

          Posté par  . Évalué à -2.

          Oui vous avez raison, j'ai pas cherché sur google ou autre avant, je voulais que les autres travaillent à ma place sans rien apprendre, je suis vraiment un gros nul et médiocre en ligne de commande! Excusez moi de ma condescendance…

          Bonne journée.

          • [^] # Re: Pas que find

            Posté par  (site web personnel, Mastodon) . Évalué à 3.

            Ce qu'il essaye de te dire, ce n'est pas que la réponse est sur gogole mais que normalement tu as tout ce qu'il faut dans le 'man find' Après tu peux ne pas avoir compris, et dans ce cas il faut indiquer ce que tu as essayé (ce qui montrera que tu as fait ton boulot et n'attends pas que ça te tombe tout mâché dans la bouche) et pourquoi (donc ce que tu as compris pour qu'on puisse éventuellement te réexpliquer si ce n'est pas clair)

            “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # ca ressemble à un exo de TP

    Posté par  . Évalué à 3. Dernière modification le 03 novembre 2017 à 22:27.

    comme dans tout exercice de programmation il faut decomposer le probleme en probleme plus simple,
    c'est ce qu'on appelle l'algoritmie

    dans ton cas :
    1°) trouver les fichiers qui ont moins d'une semaine
    2°) pour chaque fichier trouver, obtenir l'arborescence et le nom du fichier
    3°) recreer l'arborescence
    4°) deplacer le fichier dans la nouvelle arborescence

    bon comme certains, depuis que linux existe, se sont deja posé la question avant toi
    il y a des outils pour cela

    1°) find me semble un bon point de depart, man find pour en obtenir les options

    2 à 4 : il y a surement des options à mv pour deplacer AVEC l'arborescence, sinon peut-etre que rsyncsaurait le faire
    sinon, ben là il va falloir coder, avec des boucles pour faire :

    • pour chacun des fichiers trouvés
      • obtenir le chemin
      • obtenir le nom du fichier
      • recreer le chemin dans la destination si il n'existe pas
      • deplacer le fichier dans ce nouveau chemin
    • fin de la boucle
    • [^] # Re: ca ressemble à un exo de TP

      Posté par  . Évalué à 2.

      pas besoin de boucle avec find : il est possible d'exécuter une action pour tout fichier trpuvé avec l'option -exec.

      Ca fait un truc du genre :

      find -exec [ params … ] {} [param … ] \;

      le motif {} sera remplacé par le chemin du fichier trouvé.

      Exemple pour lister les fichiers trouvés dans une arborescence :

      find . -exec ls -l {} \;

      Je donne cette piste au P.I même s'il s'agit d'un TP car elle n'est pas forcément simple à comprendre à partir d'un man, et peut s'avérer très utile.

      • [^] # Re: ca ressemble à un exo de TP

        Posté par  . Évalué à -1.

        j'ai déjà exploré ce coté là mais la mv me donnent des problèmes.
        Merci de vos pistes.

        Je crois que je vais utiliser un workaround comme crontab et le lancer chaque semaine

        Et je quitte ce forum cela fera du bien à certain et promis si j'ai un problème sous windows --> F1 et sous linux --> man !  ;)

        Bonne journée

        • [^] # Re: ca ressemble à un exo de TP

          Posté par  . Évalué à 3.

          Sinon j'ai trouvé sur d'autres forums en regroupant les infos et un peu de débogage, mon problème à la base est l'utilisation de -type que j'ai remplacé par -maxdepth
          Et je partage au cas où …

          find /source -maxdepth 1 -mtime +7 -exec mv '{}' /destination/ \;

          Bonne journée

          • [^] # Re: ca ressemble à un exo de TP

            Posté par  . Évalué à 3.

            Salut,

            Merci du partage (qui est un peu l'âme du site) mais juste pour info, ici, tu ne résous pas du tout ton problème initial. Au contraire, tu te limites ici à ce qui se trouve dans ton répertoire « source » SANS descendre dans ses sous-répertoires, ce qui est justement le problème qui t'amène ici.

            Le problème principal est que, contrairement à d'autres commandes, « mv » ne va pas créer le sous-répertoire parent s'il n'existe pas à l'avance. Tu pourrais tout faire tenir en une seule commande find mais il faudrait pour cela tester l'existence du sous-répertoire (avec test ou avec les opérateurs de bash, le créer le cas échéant avec mkdir -p (-p pour créer les sous-répertoires parents si nécessaire) et enfin, y copier ton fichier.

            Mais il y a plus rapide : « cp -R » permet de COPIER récursivement une ou plusieurs sources vers une destination donnée et par conséquent, les sous-répertoires et toute l'arborescence. Donc, si ton répertoire initial n'est pas trop lourd, je le copierais en entier avec cette commande puis j'utiliserais ensuite find pour supprimer toutes les copies des fichiers âgés de MOINS d'une semaine.

            Plutôt que les supprimer directement, je les déplacerais dans un répertoire temporaire pour éviter tout accident puis, une fois m'être assuré de son contenu, je supprimerais le répertoire temporaire en question.

            Enfin, si l'opération que tu comptes faire est régulière, alors tu peux te permettre de saisir directement la commande que tu cites sans même utiliser « maxdepth » puisque tu sais que les sous-répertoires de destination existeront déjà.

            Et en bonus : si tu comptes mettre en place une copie de l'arborescence vide (c'est-à-dire juste les sous-répertoires sans les fichiers) justement pour l'exploiter de cette façon, tu peux utiliser l'option « -type d » de find pour lui demander de trouver tous les répertoires.

            Bon courage.

            • [^] # easy peasy

              Posté par  . Évalué à 1. Dernière modification le 04 novembre 2017 à 19:15.

              find . -depth -mtime +6 -a \( -type d -exec /bin/echo mkdir /dest/{} \; -o -type f -exec /bin/echo mv {} /dest/{} \; \) 2> /dev/null

              Mtime à adapter en fonction de ce que tu veux (et oui, le titre de ton sujet est en contradiction avec son corps).

              De rien, man est ton ami pour les explications… (édit je m'adresse à l'auteur de la question)
              (edit2: ça ne marche pas en fait… désolé j'avais voulu être plus astucieux, mais bon… il reste la possibilité de créer d'office les répertoires en bougeant le test mtime dans la branche qui copie les fichiers, et éventuellement avoir une autre commande pour purger les répertoires vides)

              • [^] # Re: easy peasy

                Posté par  . Évalué à 2.

                le faire en 2 passes éventuellement, sachant que mkdir -p crée toute une arborescence si elle n'existe pas.

  • # essaye avec ça

    Posté par  . Évalué à 1. Dernière modification le 06 novembre 2017 à 17:07.

    Si le répertoire n'existe pas dans la cible, il sera créé.

    find repSource/ -name "*" -type f -mtime +7 -exec sh -c '[ -d "repCible/${1%/*}" ] || mkdir -p "repCible/${1%/*}"; cp "${1}" "repCible/${1}";' _ {} \;
    
    • [^] # Re: essaye avec ça

      Posté par  . Évalué à 4.

      Mais oui, faisons 1 millions de fork pour 1 millions de fichiers…

      • [^] # Re: essaye avec ça

        Posté par  . Évalué à 2. Dernière modification le 07 novembre 2017 à 08:50.

        Ouhlà !!! Tu as tout-à fait raison

        Désolé : je me suis lamentablement planté en proposant ça.

        =======
        Il faudrait barrer mon précédent message, mais je ne peux l'éditer.
        Si un modérateur a quelques instants pour le faire, je l'en remercie d'avance.

        • [^] # Re: essaye avec ça

          Posté par  . Évalué à 3.

          en meme temps c'est bien pour apprendre ;)

Suivre le flux des commentaires

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