Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/03/2014, à 12:24

Jpmtrax

Syntaxe de la commande find [RESOLU]

Bonjour, j'ai un peu de mal à comprendre la syntaxe de cette commande. Je souhaite en fait rechercher des fichiers nommés *secours.mp3 datant de plus de 15 jours afin de les effacer automatiquement dans mon répertoire /media/DONNEES, et cela une fois par semaine via crontab. Précision : je fais cela depuis une interface webmin.

J'ai donc rajouté dans mon crontab la règle suivante.

0 0 * * 0 find -name \media\DONNEES\*secours.mp3 -ctime +15 -exec rm {} \;   

par contre quand je l'exécute j'ai l'impression que ça ne fonctionne pas.
J'ai ce message : "no output generated".

J'avoue ne pas trop comprendre, et auparavant quand je tapais 0 0 * * 0 find -name /media/DONNEES/*secours.mp3 -ctime +15 -exec rm {} \;   j'avais un autre message d'erreur qui me disait que les chemins doivent précéder l'expression. C'est en parcourant le forum que j'ai vu que ma première erreur venait du slash et qu'il fallait donc faire un anti-slash. Donc je suppose que de ce côté là c'est bon.

Par contre quand je tape la commande dans un shell, rien ne s'affiche. J'aimerais savoir quelle erreur de syntaxe j'ai faite (il y en a forcément une). hmm

D'avance merci pour vos réponses...

Dernière modification par Jpmtrax (Le 10/03/2014, à 14:54)


Perso : Tour Packard Bell avec Xubuntu 18.04 LTS (32 bits)  + 20.04 LTS (64 bits) + Win XP SP3 - Intel Core 2 Extreme X6800 2,93 Ghz - 4 Go Ram / Netbook Packard Bell Dot S avec Lubuntu 16.04 LTS + Win XP SP3 - Intel Atom N450 - 2 Go Ram / Boulot : AMD Ryzen 5 1400 - 8 Go Ram -Xubuntu 18.04 LTS

Hors ligne

#2 Le 10/03/2014, à 13:00

tiramiseb

Re : Syntaxe de la commande find [RESOLU]

C'est en parcourant le forum que j'ai vu que ma première erreur venait du slash et qu'il fallait donc faire un anti-slash.

Non, il ne faut pas utiliser des anti-slashes. Dans les chemins, on utilise des slashes. Les anti-slashes, c'est sous Windows.

auparavant quand je tapais 0 0 * * 0 find -name /media/DONNEES/*secours.mp3 -ctime +15 -exec rm {} \;   j'avais un autre message d'erreur qui me disait que les chemins doivent précéder l'expression

Tu « tapais » ça ? Tu veux dire que c'est la commande que tu avais mise dans le crontab, ou alors tu tapais ça en ligne de commande !?

-------------------

Bon, pour corriger tes erreurs, voici le pourquoi du comment :

"find" a pour objectif de rechercher des fichiers dans une arborescence. Il faut lui dire où est cette arborescence (ce que tu n'as pas fait), et puis les noms de fichiers ne doivent pas contenir de slashes ; par ailleurs, il est préférable de protéger l'astérisque pour qu'il ne soit pas interprété par le shell.

LA commande valide et qui ressemble le plus à ce que tu as écrit là serait :

find /media/DONNEES -name '*secours.mp3' -ctime +15 -exec rm {} \;

Attention, cette commande cherche les fichiers « *secours.mp3 » dans /media/DONNEES et tous ses répertoires enfants.
Si tu ne veux traiter que les fichiers directement dans /media/DONNEES, il faut plutôt faire :

find /media/DONNEES -maxdepth 1 -name '*secours.mp3' -ctime +15 -exec rm {} \;

Dernière modification par tiramiseb (Le 10/03/2014, à 13:01)

Hors ligne

#3 Le 10/03/2014, à 14:54

Jpmtrax

Re : Syntaxe de la commande find [RESOLU]

Non, il ne faut pas utiliser des anti-slashes. Dans les chemins, on utilise des slashes. Les anti-slashes, c'est sous Windows.

Ah d'accord. Autant pour moi.

Tu « tapais » ça ? Tu veux dire que c'est la commande que tu avais mise dans le crontab, ou alors tu tapais ça en ligne de commande !?

je me suis mal exprimé. C'est la commande que je mettais dans le crontab.

par ailleurs, il est préférable de protéger l'astérisque pour qu'il ne soit pas interprété par le shell

ok je viens de comprendre. Au départ j'ai tapé dans le crontab quasiment la même commande que toi sauf que je n'ai pas protégé l'astérisque. Donc il me manquait ce symbôle : ' avant et après *secours.mp3 . Là ça fonctionne parfaitement. Merci beaucoup pour le coup de main smile et je vais bien noter la syntaxe dans mon carnet lol


Perso : Tour Packard Bell avec Xubuntu 18.04 LTS (32 bits)  + 20.04 LTS (64 bits) + Win XP SP3 - Intel Core 2 Extreme X6800 2,93 Ghz - 4 Go Ram / Netbook Packard Bell Dot S avec Lubuntu 16.04 LTS + Win XP SP3 - Intel Atom N450 - 2 Go Ram / Boulot : AMD Ryzen 5 1400 - 8 Go Ram -Xubuntu 18.04 LTS

Hors ligne

#4 Le 21/07/2014, à 10:43

Mophete

Re : Syntaxe de la commande find [RESOLU]

Bonjour,

Moi je cherche à supprimer dans un répertoire donné tous les répertoires et leur contenu quel qu'il soit ayant plus de 31 jours.

La commande suivante me semblait bien mais je ca m'indique également les répertoires du mois en cours.....

find /vomume1/Securite -type d -ctime +31 -exec rm -Rf {};

Pouvez-vous m'aider svp ?

Dois-je mettre un "\" à la fin de ma mligne de commande ?
Il sert à quoi cet antislash ?

Merci pour vos réponses smile

Dernière modification par Mophete (Le 21/07/2014, à 11:07)

Hors ligne

#5 Le 21/07/2014, à 11:29

pingouinux

Re : Syntaxe de la commande find [RESOLU]

Bonjour,
Veux-tu supprimer uniquement ce qui a plus de 31 jours, ou bien tous les répertoires de plus de 31 jours (pouvant contenir éventuellement des éléments plus récents) ?

D'autre part, la syntaxe est

find ... -exec commande \;

Édité : Petite correction

Dernière modification par pingouinux (Le 21/07/2014, à 11:52)

Hors ligne

#6 Le 21/07/2014, à 11:33

Postmortem

Re : Syntaxe de la commande find [RESOLU]

Salut,
Le souci vient du fait que la date de modification d'un répertoire ne change qui si on créé ou supprime quelque chose dedans. Si on modifie un fichier déjà existant dans ce répertoire, la date ne change pas.
Du moins, ceci est valable pour la date de modification que l'on recherche avec l'option -mtime de find.
Avec -ctime, on fait une recherche sur la date de dernier changement de statut ; perso, je n'utilise jamais ça.
Il faudrait donc que tu recherches les fichiers non modifiés depuis plus de 31 jours pour les supprimer et ensuite, supprimer les répertoires vides.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#7 Le 21/07/2014, à 12:10

Mophete

Re : Syntaxe de la commande find [RESOLU]

Merci à vous 2 pour avoir pris un peu de votre temps pour moi smile

Je cherche à supprimer tous les répertoires qui ont plus de 31 jours, et leur contenu. (donc 32 jours inclu, et au delà...), donc avec l'option -mtime (merci Postmortem)

Ces répertoires sont créés à un instant T avec leur contenu, et ne sont plus jamais modifiés par la suite (il s'agit d'enregistrements de caméras de surveillance), si on passe 2 fois devant l'une d'elles avec un écart de 5 minutes par exemple, elle crée 2 répertoires dont le nom contient la date et l'heure, avec les enregistrements correspondants.
il peut éventuellement avoir 2 enregistrements au sein du même répertoire si on passe 2 fois devant la même caméra en moins d'une minute...mais une fois cette minute terminée, il ne sera plus jamais modifié puisqu'elle écrira dans un autre répertoire.

j'arrive bien à lister les répertoires qui correspondent à ma recherche avec la commande suivante :

find -type d -mtime +31

l'ajout à la fin de cette commande de

-exec rm -Rf

le système me sort ceci :

find: -exec CMD must end by ';'

étant bête et discipliné à peu près autant que peut l'être un système d'exploitation (quoi que parfois, les lois de l'informatique sont impénétrables...), je rajoute donc à la fin de la ligne le ';' :

find -type d -mtime +31 -exec rm -Rf;

il me ressort quand même cette erreur là...

J'ai vu quelque part ceci :

find -type d -mtime +31 -exec rm -Rf {};

les accolades sont nécessaires ou non ? (quand je les met je retombe de toute manière sur l'erreur...je dois mettre l'antislash ou pas ?

Si je met simplement ceci :

find -type d -mtime +31 -exec rm -Rf \;

Là ça semble tourner......

J'ai bidouillé pendant que j’écrivais cette réponse, je laisse le début de ma réponse pour le suivi de la chose et pour la communauté.

Mais je ne trouve pas l'utilité de la notion de cet '\', si ce n'est que sans lui ça ne fonctionne pas.....et ces '{}' qui ne donnent rien...


Il me reste à en faire un script exécutable qui se lance une fois par semaine, pendant le week-end tongue

Hors ligne

#8 Le 21/07/2014, à 12:20

pingouinux

Re : Syntaxe de la commande find [RESOLU]

Je ferais ceci

find /vomume1/Securite -type d -mtime +31 -delete

L'arborescence sera parcourue à partir du bas, et les répertoires vides qui remplissent la condition des 31 jours seront supprimés.

Modifié : Ajout de /vomume1/Securite pour ne pas détruire autre chose

Dernière modification par pingouinux (Le 21/07/2014, à 12:22)

Hors ligne

#9 Le 21/07/2014, à 12:37

Mophete

Re : Syntaxe de la commande find [RESOLU]

il n'y a que des répertoires non vides...

la commande indiquée plus haut ne génère aucune erreur, mais un

find -type d -mtime +31

juste après un retour au prompt me ressort des résultats, qui auraient donc dus être effacés préalablement...

Hors ligne

#10 Le 21/07/2014, à 12:56

Postmortem

Re : Syntaxe de la commande find [RESOLU]

"find: -exec CMD must end by ';'" veut dire que la commande après "-exec" doit se terminer par un ";".
Le ";" étant un caractère spécial du shell, le shell interprète ce caractère qui veut dire fin d'une commande. Ainsi le shell détecte la fin du find et exécute la commande find sans le ";".
Il faut donc écrire "\;", ainsi le shell n'interprete pas spécialement le ";" et le transmet à find (sans le "\" qui est devant). Et donc, "-exec" voit bien un ";" qui marque la fin de la commande.
Les "{}" sont remplacées par le nom de fichier/dossier trouvé par find, il faut bien les mettre.
Ta commande doit donc ressembler à quelque chose de ce goût :

find /repertoire/de/départ -depth -type d -mtime +31 -exec rm -rf {} \;

Édit :

Mophete a écrit :

il n'y a que des répertoires non vides...

la commande indiquée plus haut ne génère aucune erreur, mais un

find -type d -mtime +31

juste après un retour au prompt me ressort des résultats, qui auraient donc dus être effacés préalablement...

C'est normal, "-mtime +31" veut dire ce qui est modifié il y a plus de 31 fois 24h. La commande lancée à qq minutes d'intervalles sort donc de nouveaux fichiers.

Dernière modification par Postmortem (Le 21/07/2014, à 13:00)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#11 Le 21/07/2014, à 12:57

pingouinux

Re : Syntaxe de la commande find [RESOLU]

Mophete a écrit :

il n'y a que des répertoires non vides...

Peut-être au départ, mais ils le deviendront si leur contenu est supprimé au cours de l'exécution de la commande (on commence par le bas de l'arborescence avec -delete).

find -type d -mtime +31

juste après un retour au prompt me ressort des résultats, qui auraient donc dus être effacés préalablement...

C'est bizarre, à moins qu'un des répertoires de plus de 31 jours contienne un fichier modifié récemment. Il faudrait voir un exemple.

Pour éviter des surprises désagréables, laisse le nom du répertoire de départ (/vomume1/Securite) dans la commande find (voir #8).

Hors ligne

#12 Le 21/07/2014, à 13:04

Postmortem

Re : Syntaxe de la commande find [RESOLU]

@pingouinux :
Je n'ai pas essayé mais je ne suis pas certain que cela fonctionne avec "-delete". En effet, lorsque tu supprimes un fichier, tu changes la date de modif du répertoire le contenant et donc, le répertoire n'apparaît plus comme modifié il y a plus de 31 jours. Rere-édit : en fait, cette remarque était valable si tu n'avais pas mis le "-type d" et que tu supprimais des fichiers avant le répertoire.

Édit : et du coup, en y repensant, ma solution ne supprimera que les dossiers se trouvant "au fond" d'une arborescence.

Re-édit :
En fait, il semble surtout que -delete ne supprime que des dossiers vides.

Dernière modification par Postmortem (Le 21/07/2014, à 13:16)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#13 Le 21/07/2014, à 13:28

Mophete

Re : Syntaxe de la commande find [RESOLU]

Je ne me sers que de la commande

rm -Rf

qui est censée supprimer des répertoires, qu'ils soient vides ou non...

Bref ça ne fonctionne pas, ça n'efface rien...

Hors ligne

#14 Le 21/07/2014, à 13:45

pingouinux

Re : Syntaxe de la commande find [RESOLU]

La remarque de Postmortem m'a fait remarquer mon erreur. Voici la commande que je voulais faire

find /vomume1/Securite -mtime +31 -delete

L'arborescence est parcourue en partant du bas. On supprime les fichiers et les répertoires vides (ou qui le deviennent) de plus de 31 jours.

Postmortem a écrit :

En effet, lorsque tu supprimes un fichier, tu changes la date de modif du répertoire le contenant et donc, le répertoire n'apparaît plus comme modifié il y a plus de 31 jours.

J'ai fait l'essai, et il semble bien que la suppression du contenu d'un répertoire par -delete ne modifie la date de modif du répertoire qu'après l'exécution du find.

Hors ligne

#15 Le 21/07/2014, à 13:55

Mophete

Re : Syntaxe de la commande find [RESOLU]

Les répertoires de plus de 31 jours ne sont pas vides...leur date de modification est inchangée....

je me sers de -delete ou rm, finalement, pour les supprimer, ces fichus répertoires non vides ?

en tout cas, merci pour votre patience smile

Hors ligne

#16 Le 21/07/2014, à 14:00

pingouinux

Re : Syntaxe de la commande find [RESOLU]

La commande de Postmortem (#10), et la mienne (#14) devraient faire ce que tu veux. La différence est que la sienne supprime aussi les nouveaux fichiers dans les vieux répertoires.

Hors ligne

#17 Le 21/07/2014, à 14:09

Mophete

Re : Syntaxe de la commande find [RESOLU]

en effet j'étais passé à côté, c'est en cours d'exécution là .....

find -depth -type d -mtime +31 -exec rm -Rf {} \;

(je me sutue déjà dans le bon dossier....je rajouterai le /volume1/Securite dans mon script...


il me manquait le -depth, finalement.

Je vous tiens au courant une fois la séquence terminée (j'ai grosso modo 1600 répertoires à supprimer)

Hors ligne

#18 Le 21/07/2014, à 14:12

pingouinux

Re : Syntaxe de la commande find [RESOLU]

À ta place, j'aurais commencé par faire un essai sur une copie d'un petit nombre de répertoires.

Dernière modification par pingouinux (Le 21/07/2014, à 14:19)

Hors ligne

#19 Le 21/07/2014, à 14:16

Mophete

Re : Syntaxe de la commande find [RESOLU]

Bah j'ai considéré que je n'effacerai rien de néfaste dans la mesure où un

find -depth -type d -mtime +31

me sort une liste pil poil correspondante à ce que je cherche (je l'avais balancé dans un fichier texte pour l'étudier tranquillement )

ca tourne toujours là...mais l'interface graphique qui affiche le contenu de la liste de répertoires montre que leur nombre diminue, donc ca me plait smile

Hors ligne

#20 Le 21/07/2014, à 14:22

Postmortem

Re : Syntaxe de la commande find [RESOLU]

pingouinux a écrit :

La commande de Postmortem (#10), et la mienne (#14) devraient faire ce que tu veux. La différence est que la sienne supprime aussi les nouveaux fichiers dans les vieux répertoires.

Ah oui, t'as raison !
Si un fichier est modifié ce jour dans un répertoire où il n'y a pas eu de création/suppression depuis + de 31 jours, il disparaît avec le répertoire si on utilise ma solution.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne