Aller au contenu

Script pour supprimer des fichiers de plus de X jours


ddjaff

Messages recommandés

Merci à vous 2

J'ai donc mis ça :

find /volume1/tests -type f -mtime +60 -delete /usr/bin/rm -vf {} \;

J'ai testé un autre repertoire que videos car j'avais un message d'erreur, mais j'ai de nouveau le même message, même en changeant de répertoire et en donnant les autorisations.

Sortie standard/erreur :
find: paths must precede expression: /usr/bin/rm
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

 

Merci pour votre aide 🙂

 

Edit : J'avais oublié le find et voici le nouveau message d'erreur que j'ai.

Merci

Modifié par FabioDM
MAJ Erreur
Lien vers le commentaire
Partager sur d’autres sites

Je viens de prendre en compte vos corrections et viens donc de tester la ligne ci-dessous

bash find/volume1/tests -type f -mtime +60 -delete /usr/bin/rm -vf {} \;

J'ai surement encore loupé un truc car voici le message d'erreur que j'ai.

Sortie standard/erreur :
bash: find/volume1/tests: No such file or directory

 

Merci pour votre aide

Modifié par FabioDM
Lien vers le commentaire
Partager sur d’autres sites

@FabioDM

Bonjour,

Avant toutes choses je t'invite à lire plus attentivement les réponses qui te sont données.

Il y a 5 heures, FabioDM a dit :

bash find/volume1/tests -type f -mtime +60 -delete /usr/bin/rm -vf {} \;

J'ai surement encore loupé un truc car voici le message d'erreur que j'ai.

Le "bash" en début de ligne n'est à mettre que SI tu exécutes ta commande dans une tâche programmée (ou non) du gestionnaire de tâches DSM.

Par contre, SI tu l'exécutes directement "à la main" dans un terminal sous SSH alors il ne faut pas mettre le "bash" en début de commande.

Comme je te l'ai déjà dit précédemment, vérifies la syntaxe et notamment la présence des espaces entre les différentes options AVANT de lancer la commande, ils ne sont pas là pas hasard ni pour faire joli ... Sinon il sera normal que tu reçoives encore des messages d'erreur. Mais c'est toi qui voit ...

Par ailleurs, si tu utilises l'option "-delete" de la commande "find" alors il ne faut pas indiquer "/usr/bin/rm -vf".

Soit tu fais "find .... -delete" soit tu fais "find .... -exec /usr/bin/rm -vf" mais ne mélanges pas les deux !

De plus un petit tour par la commande "man find" te sera utile pour bien comprendre toutes les options de la commande "find".

Donc la commande correcte est :

Citation

find /volume1/tests -type f -mtime +60 -exec /usr/bin/rm -vf {} \;

OU

find /volume1/tests -type f -mtime +60 -delete {} \;

Cordialement

oracle7😉

Lien vers le commentaire
Partager sur d’autres sites

Il y a 1 heure, oracle7 a dit :

la commande correcte est :

find /volume1/tests -type f -mtime +60 -delete {} \;

Non, pas de "{} \;" apres "-delete" (c'est aussi pourquoi j'ai dis que c'était plus concis)

Il y a 1 heure, oracle7 a dit :

Le "bash" en début de ligne n'est à mettre que SI tu exécutes ta commande dans une tâche programmée (ou non) du gestionnaire de tâches DSM.

Je n'ai jamais eu à faire ça et la preuve est que ça échoue 

Ci dessous résultat d'une tache avec pour contenu "bash find <arguments non destructifs ici>":

Cher utilisateur,

Le planificateur de tâches à terminé une tâche planifiée.

Tâche : testusertask
Heure de début : Fri, 21 May 2021 17:28:09 GMT
Heure d’arrêt : Fri, 21 May 2021 17:28:10 GMT
État actuel : 126 (Interrompu)
Sortie standard/erreur :
/bin/find: /bin/find: cannot execute binary file
 
Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

Merci pour tes explications @oracle7, je pensais avoir fais le max pour lire en détail vos réponses mais je suis surement passé à côté ou mal compris ce qu'on a voulu m'expliquer.

Bref, en tout cas, la c'est très clair et fonctionne parfaitement. En attendant de comprendre la différence entre delete et vf, je reste sur vf.

Merci à tous pour le temps que vous avez pris pour m'expliquer 🙂

Lien vers le commentaire
Partager sur d’autres sites

Le 20/05/2021 à 07:34, MilesTEG1 a dit :
Le 20/05/2021 à 07:28, CoolRaoul a dit :

Je ne comprends pas ce qui fait dire que "-exec /usr/bin/rm -f {} \;" serait plus efficace que "-delete."
Au contraire la première forme lance un process pour chaque suppression alors que l'autre n'en lance aucun (c'est built-in dans find).
Même si j'imagine que l'impact reste minime bien entendu.

Ha je savais pas que le find avant un flag -delete...
Du coup je suis curieux de savoir s'il y a une différence entre les méthodes et une préférence à avoir.

@MilesTEG1 : tu n'avais pas ta réponse, là ?

 

Modifié par Kramlech
Lien vers le commentaire
Partager sur d’autres sites

@MilesTEG1, @FabioDM, @CoolRaoul

Bonjour,

Certes la version "-delete" est plus concise (oups pour le "{} \;" de trop à la fin : mauvais C/C 🥴),mais je préfère personnellement la version "longue" avec "rm" car elle permet un mode verbose plus sécure au moment de supprimer effectivement les fichiers.

Sauf erreur de ma part, le mode verbose de la commande "find" avec l'option "-ok" fait juste une demande de confirmation au lancement de la commande, ce qui me parait insuffisant.

Voilà la différence, enfin ce que j'en ai compris ...

PS : Pour l'exécution dans une tache programmée, effectivement cela ne marche pas en direct. Dans mon élan j'ai été trop rapide dans mon explication il fallait mettre la commande dans un shell script exécutable par ex : "fichier.sh" et la tâche exécute ce script avec "bash fichier.sh". Merci  @CoolRaoul pour le rappel 🙂

Cordialement

oracle7😉

 

Modifié par oracle7
Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...
Le 21/05/2021 à 20:18, oracle7 a dit :

je préfère personnellement la version "longue" avec "rm" car elle permet un mode verbose plus sécure au moment de supprimer effectivement les fichiers.

Dans ce cas on peut utiliser cette approche aussi (au passage je ne suis pas sur de comprendre le "plus secure" )

find <bla bla> -print -delete

le "-print" aura pour effet d'ajouter la verbosité souhaitée en traçant les fichiers destinés à être supprimés par la clause suivante, "-delete".

Et, si on insiste à utiliser "rm", plutôt privilégier ceci alors:

find  <bla bla> -print0 | xargs -0 rm  -v

au moins il n'y aura pas un process forké pour chaque fichier supprimé (meme si je reconnais qu'on est loin d'un possible problème de perf, j'ai juste tendance à être parfois inutilement perfectionniste)

Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Bonjour,

Je voudrais faire la même chose que la plupart d'entre vous, supprimer tous les fichiers qui ont plus de X jours.

J'ai saisi la commande dans le planificateur de tâche directement et, sans le paramètre -time +X tout fonctionne bien, tout est supprimé, fichiers et dossiers. Mais en ajoutant le paramètre, plus rien n'est supprimé. 

Je m'interroge donc sur ce paramètre 🤔

Si j'ai bien compris :

-mtime +30 : date de modification supérieure à 30 jours

Moi, ce serait la date de création est-ce bien la même chose ?

Merci

PS :

sachant que le dossier IPCAM contient un dossier par caméra, du nom de la caméra, qui contient lui deux sous-dossiers "snap" et "record"

Commande qui supprime bien tout :

find /volume1/IPCAM -mindepth 2 -maxdepth 2 -execdir rm -rf {} +

Commande qui ne supprime rien :

find /volume1/IPCAM -mindepth 2 -maxdepth 2 -mtime +30 -execdir rm -rf {} +

Modifié par db77
Lien vers le commentaire
Partager sur d’autres sites

@db77

Bonjour,

Il y a 2 heures, db77 a dit :

-mtime +30 : date de modification supérieure à 30 jours

Moi, ce serait la date de création est-ce bien la même chose ?

Sauf erreur de ma part, c'est la même chose, de toutes façon le man de "find" pour l'option "-mtime" stipule "File's data was last modified less than, more than or exactly n*24 hours ago."

Par ailleurs, pour l'exécution dans une tache programmée, vu que la commande ne marche pas en direct, il te faut mettre la commande dans un shell script exécutable par ex : "fichier.sh" et la tâche exécutera ce script avec "bash fichier.sh".

Pour la commande, je te propose de corriger par ceci :

find /volume1/IPCAM \( -type f -o -type d \) -mindepth 2 -maxdepth 2 -mtime +30 -execdir /usr/bin/rm -rf {} \;

Attention à la dangerosité du "rm -rf"  mieux vaut un "rm -vf", mainenant ce que j'en dis, c'est toi qui voit ...

Teste la aussi quand même dans un terminal sous SSH avant de la mettre dans une tâche programmée !

Cordialement

oracle7😉

Lien vers le commentaire
Partager sur d’autres sites

@bliz

Bonjour,

il y a 6 minutes, bliz a dit :

il me semble qu'il faut remplacer "mtime" par "ctime" pour la suppression soit sur la date de création des fichiers

Bah, j'en suis pas sûr du tout quand je lis le man de "find" :

xTSMeL0.png

Je n'associe pas forcément le statut du fichier "changed" à "created" car quand le fichier est créé on ne peux pas dire que son statut à changé vu qu'il n'avait pas de statut auparavant, non ? ... C'est ma logique (discutable certes ...) .

C'est vrai que "status changed" pour "-ctime" et "data modified" pour "-mtime" sont aussi deux choses différentes.

Cordialement

oracle7😉

 

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir et merci de m'avoir répondu.

Mais étant donné que je ne connais pas du tout Linux, et pas vraiment DSM, j'ai cherché comment passer en mode "ligne de commande" comme sous Windows depuis l'interface web de mon NAS mais n'ai rien trouvé. Cela m'aurait permis de tester les différentes commandes, avant de les intégrer dans un fichier .sh. Mais je ne sais même pas comment écrire un fichier.sh je suppose qu'il me faut un éditeur de texte mais lequel.

Merci de m'aiguiller sur cela afin que j'avance un peu. 

Je vais essayer avec le ctime plutôt que le mtime au cas où...

EDIT : sinon, seul l'ajout de -mtime +30 empêche ma ligne de commande de fonctionner. Du coup, pourquoi changer execdir comme tu me le proposes @oracle7 vu qu'il fonctionne sans le -mtime ? Quelle est la différence entre -rf et -vf (question d'un ignorant Linux) ? Je pense que (-type f -o -type d) veut dire fichier ou directory...

Modifié par db77
Lien vers le commentaire
Partager sur d’autres sites

il y a 22 minutes, bliz a dit :

l'éditeur de texte de windows devrait suffire, le bloc note, une fois la commande enregistré, il suffit de renomer le fichier.txt en fichier.sh

Oui, c'est clair, je vais essayer... mais sans la suppression pour voir.

EDIT : j'ai essayé mais rien... 

1 - fichier "menage.sh" contenant : find /volume1/IPCAM \( -type f -o -type d \) -mindepth 2 -maxdepth 2 -mtime +1

2 - ligne dans tâche : bash /volume1/dossier/menage.sh

3 - output.log vide 😒

EDIT2 : apparemment la combinaison des -type ne lui plaît pas car il me liste tous les répertoires et aucun fichier. Je vais essayer avec -type f uniquement

Il ne me sort que ça : /volume1/IPCAM/#recycle/desktop.ini alors que  j'ai une image du 17 juin 2021 dans /volume1/IPCAM/FI9821P_C4D6553DF61C/snap/IMG_20210617_190122.jpg 
EDIT 3 : -maxdepth 3 et ça sort !!! Je progresse

EDIT 4 : RÉSOLU !!! Un grand merci pour votre aide. Voici la ligne : 
find /volume1/IPCAM \( -type f -o -type d \) -mindepth 3 -maxdepth 3 -mtime +30 -execdir /usr/bin/rm -rf {} \;

En fait c'était juste un problème de profondeur dans l'exploration des sous-dossiers. Bizarre quand même que l'ajout du paramètre -mtime +30 ait suffi à ne plus faire fonctionner mon script. Bref, cela m'a permis d'apprendre des trucs et MERCI

Modifié par db77
Lien vers le commentaire
Partager sur d’autres sites

@db77

Bonjour,

Pour l'éditeur de texte, je m'orienterais plutot vers notepad afin de généter des fichiers texte en UTF8 pour ne pas introduire d'éventuelles erreurs d'interprétation par le shell Linux, car (pour faire simple) le bloc note windows conserve des caractères "cachés" propres à windows que le shell Linux n'aime pas..;

Pour accèder au mode "ligne de commandes" avec DSM, le mieux est d'accèder via un termimal avec le logiciel PuTTY ou avec mieux WinSCP qui lui présente l'avantage de naviguer facilement dans l'arborescence  du système de DSM.

Je te renvoie à ce TUTO pour établir une connexion root en SSH au système DSM (v6 ou v7) :

  • TUTO : Accés SSH et ROOT via DSM6

     

Pour démarrer voici un récapitulatif des principales commandes shell Linux : https://buzut.net/101-commandes-indispensables-sous-linux/

Pour les script shell bash regardes aussi ceci : https://abs.traduc.org/abs-fr/index.html

L'option -r de rm est la récursivité (supprime les dossiers et tout leur contenu).

L'option -v est le mode verbose (bavard = trace toutes les opérations).

L'option -f est le mode force qui ignore les fichiers/arguments non existants et n'affiche rien.

il y a 38 minutes, db77 a dit :

pourquoi changer execdir comme tu me le proposes

Je ne change rien, je remets correctement la syntaxe de l'option "-execdir" soit " -execdir /usr/bin/rm (rf {} \; " par rapport à la tienne qui est incomplète. Ni plus ni moins ...

Astuce : Pour avertir un membre de ta réponse, tu tapes dans ton message "@" + les premiers caractères de son pseudo. Dans le popup qui apparaît tu cliques alors sur le pseudo recherché et il s'affiche sur fond bleu dans ton texte. Ainsi ton interlocuteur est informé/notifié de ta réponse sinon il ne voit rien sauf à rebalayer en arrière tous les messages (ce que peu de monde fait).

Cordialement

oracle7😉

Modifié par oracle7
Lien vers le commentaire
Partager sur d’autres sites

Un grand MERCI à toi @oracle7 je vais prendre un peu de temps et regarder tout ça.

J'ai bien suivi le tuto pour se connecter avec PuTTY ou WinSCP. Je vais lire les tutos sur les commandes et modifier ma tâche en fonction de tes remarques. Encore merci à toi @oracle7

Modifié par db77
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.