Parcourir un dossier

Bonjour à tous et tout d’abord merci d’avance pour votre aide.

Voilà mon soucis est simple. Je suis débutant sous Linux et j’aimerais créer sous debian un script parcourant un dossier.

Pour tout les dossiers et fichiers contenus dans le répertoire père, si la date de création est antérieure à un mois,
je supprime le fichier ou dossier en question.

Dans un premier temps je ne gère pas les sous dossiers, sous sous dossiers etc…

Existe t il une commande ou un moyen simple de parcourir un dossier sous linux?

Merci a tous 8) .

Bonjour,

Pour parcourir des dossiers, tu peux regarder la commande find (man find).
Il faut regarder les critères atime, mtime et ctime pour rechercher des fichiers en fonction des dates.

Exemple, pour chercher des fichiers de plus de 30 jours dans le répertoire de l’utilisateur et les effacer :

Les sous dossiers seront également prise en compte.

( ma réponse était hors sujet - comment la supprimer ? )

Merci yap22 pour ta réponse :stuck_out_tongue:

j’ai essayé avec la commande find et effectivement c’est bien cela dont j’ai besoin.
Par contre j’ai une erreur bizarre, en faite le find ne reconnait pas mon chemin et du coup il cherche le path dans les paramètres…

Voici ma commande

find /home/user/repertoire -amin 5 -exec rm ‘{}’ ;
==> avec l’option de débogage -D j’ai obtenu le message d’erreur suivant Ignoring unrecognised debug flag `/home/user/repertoire’

en faisant un man find ils ne précisent pas de syntaxe particulières pour donner le path.
j’ai tenté de mettre des ‘’, des “”, de stocker le path dans une variable mais en vain.

Du coup j’ai essayé en faisant un cd /home/user/repertoire
puis find . -amin 5 -exec rm ‘{}’ ;

A chaque fois j’ai le même message d’erreur. Au secours !!! lol
Quelqu’un à une idée?

Merci d’avance à tous.

J’ai essayé chez moi, ça marche: ( dans un script “script_test” qui cherche dans le répertoire ~/tmp/ et avec un “cat” au lieu de “rm”):

$ /home/eric/tmp/script_test
Debut de /home/eric/tmp/script_test
echo " Debut de $0"
find /home/eric/tmp -amin 1 -exec cat ‘{}’ ;
echo "FIN"

FIN

Il ne s’agit sans doute pas d’une erreur de syntaxe de find, en tout cas pas pour ma version:
$bash --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright © 2007 Free Software Foundation, Inc.

[i]$ find --version
find (GNU findutils) 4.4.0
Copyright © 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Options activées: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) [/i]

Merci Josephtux pour ton aide,

J’ai regardé hier les version du bash et du find, déjà ce sont les même que toi.

Après différents test je me suis apercu qu’en faite, cela plante lorsque je pointe sur répertoire.
Je m’explique:

Admettons l’arborescence suivante /home/user/tmp où tmp est un dossier.
tmp contient plusieurs fichiers fic fic1 fic2 …

Si je fais un find -D /home/user/tmp -amin 1 -exec rm ‘{}’ ; , ça plante le find le trouve pas le répertoire et renvoi le message d’erreur cité plus haut.

Par contre si je fais un find -D /home/user/tmp/fic -amin 1 -exec rm ‘{}’ ; cela me vide le contenu du fichier fic car il a été modifié il y a plus d’une minute.

les commandes cat et rm marchent sur le fichier, donc je ne pense pas que cela vienne du rm.

Je vais essayer de voir si je peux forcer dans un dossier.
Voilà si quelqu’un à une idée n’hésitez pas.

Merci encore pour votre aide.

Un pti up pour informer de là où j’en suis :stuck_out_tongue: .
Bon alors déjà j’ai réussi à faire marcher le find, et par rapport au but de mon script j’arrive au bout.
Pour l’instant je parcours mon répertoire père passé en paramètre, et je liste ses dossiers enfants.

Pour chacun de ces dossiers, je regarde le contenu et et j’éxecute une action grâce à mon find.

Seulement voilà, lorsque l’action est d’afficher les fichiers modifiés il y a plus d’une minute… ça marche nikel
Mais si je veux les supprimer, là il me supprime carrément le répertoire enfants…

Je rame depuis deux heure sur ce détail, je ne vois pas quoi faire, Help!!! lol

Je donne mon script en entier, dites moi si vous voulez que je l’épure.

#!/bin/bash

#On se positionne dans le dossier /home/user
chemin=/home/user
cd $chemin

#On commence par parcourir les dossiers contenus dans user
i=0
for inode in $(ls -R)
do
if
#Si c est un dossier
[ -d $inode ]
then
#Concaténation du chemin ==> /home/user/dossierenfant/
unDossier="$chemin/$inode/"

            #Ce find fonctionne correctement
	find $unDossier -amin 1 -exec ls -l {} \;
	
            #Celui là supprime le dossier enfant
            find $unDossier -amin 1 -exec rm -rf {} \;

	((i++))
fi

done

Voilà merci d’avance pour votre aide.

1 Plutôt que ces contorsions en bash, il me semble que find fait celà mieux et plus rapidement. Cherche plutôt de ce côté là

Peut-être suffit-il d’ajouter un critère à find ( comme -iname’fic’ ) pour préciser les fichiers cibles.

2 find accepte aussi une liste de chemins initiaux

3 ( L’option -D attend autre chose que le répertoire ) essaye sans l’option -D.

4
-atime -5 = depuis moins de 5 jours
-atime +5 = depuis plus de 5 jours
-atime 5 = depuis 5 jours

bonne recherche

Ton find qui fait le rm (celui qui ne marche pas) va trouver le répertoire enfant… Donc tenter de le supprimer (et donc échouer puisque tu ne mets pas l’option -r au rm).

Il faut que tu ajoutes “-type f” au find pour ne trouver que les fichiers (y compris dans le contenu du dossier enfant qui peut contenir des dossiers).

S’il contient des dossiers et que tu les veux, il te suffit de retirer le premier résultat du retour de ton find (le répertoire enfant qu’il trouve alors que tu ne le veux pas sera toujours le premier résultat).

Pour celà :

find $unDossier -amin 1 -exec rm -rf {} ; | grep -v “^$unDossier$”

(le grep -v retire la ligne qui contient que le nom de ton dossier).

Bonjour à tous,

Désolé d’avoir mis autant de temps à répondre.
La solution de Phi marche du feu de dieu!!!

Donc on peut considérer ce sujet comme résolu, voici le script terminé ci dessous,
ça pourra peut être servir à quelqu’un.

#!/bin/bash

#On se positionne dans le dossier /home/User
chemin=/home/User
cd $chemin

#On commence par parcourir les dossiers contenus dans User
i=0
for inode in $(ls -R)
do
if
#Si c est un dossier
[ -d $inode ]
then
unDossier="$chemin/$inode/"
find $unDossier -amin +1 -type f -exec rm -r {} ;
((i++))
fi
done

Ensuite si on veut automatiser le vidage des dossiers de manière simple, il faut utiliser cron, qui est le planificateur de tâches sous linux:

Il existe plusieurs dossiers contenant des tâches exécutées par les crons :
•/etc/cron.hourly : les scripts exécutés chaque heure.
•/etc/cron.daily : les scripts exécutés chaque jour.
•/etc/cron.weekly : les scripts exécutés chaque semaine.
•/etc/cron.monthly : les scripts exécutés chaque mois.

Voilà, en vous remerciant tous encore.

Ptinoobie :wink:

Ravi d’avoir participé à la résolution de ton problème. Bonne continuation.