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 30/09/2015, à 15:53

T-800

Recherche la bonne commande avec Find pour demande particulière

Bonjour,

J'ai un serveur linux avec sur le home partagé des dossiers cache spécifique a des applications et j'aimerai les vider de façon général.

Par exemple dans le dossier nommé "perso" de chaque utilisateur, imaginons 2 dossiers suivant :

.config/
cache/

J'aimerai trouver une commande avec find qui recherche dans toute la partition /home les dossiers /perso/.config et /perso/cache et quand il les trouves, il doit effacer tous les fichiers & dossiers de façon récursive présent dans celui-ci mais pas le dossier lui même (juste vider ce qui est dedans).

Imaginons par exemple pour un utilisateur "toto" :

/home/toto/perso/.config/
/home/toto/perso/cache/
avec dedans des fichiers et des dossiers, il faut que la commande find supprime tout ce qu'il y a dedans mais que ça garde le dossier vide ".config" et le dossier "cache". idem pour tous les utilisateurs qui aurai ces dossiers.

Par contre tout ce qui est en dehors doit être conservé, donc si par exemple il y a des fichiers directement dans /home/toto ou même /home/toto/perso (mais pas ds le .config et cache) doivent rester.

Quelle serai la meilleur commande pour faire ça ?

Dernière modification par T-800 (Le 30/09/2015, à 15:55)

Hors ligne

#2 Le 30/09/2015, à 16:18

pingouinux

Re : Recherche la bonne commande avec Find pour demande particulière

Bonjour,
Essaye ceci

cd /home/toto/perso
find .config cache -mindepth 1 -print

Si la liste est correcte, tu remplaces -print par -delete

find .config cache -mindepth 1 -delete

Voici le test que j'ai fait

$ cd /tmp/perso
$ tree -a /tmp/perso
/tmp/perso
├── autre
│   ├── fichier1
│   ├── fichier2
│   ├── fichier3
│   ├── fichier4
│   ├── fichier5
│   └── sous_repertoire
│       ├── a
│       ├── b
│       ├── c
│       └── d
├── cache
│   ├── fichier1
│   ├── fichier2
│   ├── fichier3
│   ├── fichier4
│   ├── fichier5
│   └── sous_repertoire
│       ├── a
│       ├── b
│       ├── c
│       └── d
└── .config
    ├── fichier1
    ├── fichier2
    ├── fichier3
    ├── fichier4
    ├── fichier5
    └── sous_repertoire
        ├── a
        ├── b
        ├── c
        └── d

6 directories, 27 files

find .config cache -mindepth 1 -delete

$ tree -a /tmp/perso
/tmp/perso
├── autre
│   ├── fichier1
│   ├── fichier2
│   ├── fichier3
│   ├── fichier4
│   ├── fichier5
│   └── sous_repertoire
│       ├── a
│       ├── b
│       ├── c
│       └── d
├── cache
└── .config

4 directories, 9 files

Hors ligne

#3 Le 30/09/2015, à 21:41

T-800

Re : Recherche la bonne commande avec Find pour demande particulière

Merci pour ta réponse pingouinux mais ce n'est pas bon, chez toi ça marche car dans ton exemple tu es directement situé a un niveau au dessus du répertoire a vider.

il y a 500 utilisateurs sur le serveur, il faut que la commande puisse fonctionner sans compter le nombre de niveau. (je ne peux pas me mettre dans le dossier perso de chacun des 500 utilisateurs et retaper ta commande tu comprend)

Prenons par exemple cette structure simple mais qui permet de tester quand même si ta commande pourrai convenir sur le serveur :

(a et b sont a la racine du home)

├── a
│   └── .config
│       └── fgsdfsgdfgs
└── b
    └── .config
        └── fgsdfsgdfgs

si je me place dans le home (cd /home) et qu'ensuite je tape ta commande :

find .config -mindepth 1 -delete

le résultat :
le message suivant : find: ".config": Aucun fichier ou dossier de ce type

et au niveau du résultat :

exactement la même chose (rien n'est effacé)

Alors qu'il faut ça :

├── a
│   └── .config 
└── b
    └── .config

pour être précis, si le compte utilisateur s'appelle "pierre.f" sur le serveur le dossier .config correspondra exactement a ça :

/home/p/pierre.f/perso/.config/

Une idée ? (il serai préférable de ne pas compter les niveaux sinon il y a un risque d'effacement de dossier qui ne doit pas l'être suivant l'emplacement depuis lequel la commande est lancé.



Il faudrait une commande qui fait le rôle suivant :

"Rechercher dans le home tous les dossiers qui s'appelle exactement ".config" et pour chaque dossier trouvé avec ce nom, effacer le contenu a l'intérieur de ceux-ci mais sans effacer le dossier lui même (il sera alors toujours présent mais vide)."

Dernière modification par T-800 (Le 30/09/2015, à 21:54)

Hors ligne

#4 Le 30/09/2015, à 22:17

T-800

Re : Recherche la bonne commande avec Find pour demande particulière

edit :

Avec la commande suivante, j'ai la liste exact des fichiers que je dois effacer mais je n'arrive a coupler le résultat avec la commande d'effacement, si je remplace le "ls" par un "rm", ça effacera aussi le dossier ou ce trouve les fichiers (.config) dans notre exemple :

find /home -name .config -exec ls {} \;

Hors ligne

#5 Le 30/09/2015, à 22:56

soshy

Re : Recherche la bonne commande avec Find pour demande particulière

Et si tu tente :

find /home -name .config -exec rm -rf {}/* \;

A essayer avec précaution...

Hors ligne

#6 Le 30/09/2015, à 23:57

T-800

Re : Recherche la bonne commande avec Find pour demande particulière

soshy a écrit :

Et si tu tente :

find /home -name .config -exec rm -rf {}/* \;

A essayer avec précaution...

ça ne fonctionne pas, il n'y a rien qui s'efface avec cette commande, il doit y avoir un problème par rapport au {}/*

Hors ligne

#7 Le 01/10/2015, à 06:37

Watael

Re : Recherche la bonne commande avec Find pour demande particulière

salut,

si .config et cache sont toujours sous /home/<username>/, un simple rm -rf /home/*/{.config,cache}/ suffit.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 01/10/2015, à 07:24

pingouinux

Re : Recherche la bonne commande avec Find pour demande particulière

Tu peux aussi essayer ceci

shopt -s globstar
find  **/.config -mindepth 1 -ls

et si c'est correct

find  **/.config -mindepth 1 -delete

Ajouté :
Et pour traiter plusieurs répertoires

find  **/{.config,cache} -mindepth 1 -delete

Dernière modification par pingouinux (Le 01/10/2015, à 07:58)

Hors ligne

#9 Le 01/10/2015, à 08:08

moko138

Re : Recherche la bonne commande avec Find pour demande particulière

Watael a écrit :

si .config et cache sont toujours sous /home/<username>/, un simple
rm -rf /home/*/{.config,cache}/ suffit.

D'une part, il me semble qu'il manque un astérisque à la fin de cette commande,
d'autre part, vu la structure décrite à la fin du message de 21h41
/home/p/pierre.f/perso/.config/
il me semble que

sudo rm -rf /home/*/*/*/.config/*; sudo rm -rf /home/*/*/*/cache/*

serait plus approprié.
            -----------
T-800 : l'absence de point devant cache/, c'est une faute de frappe ou c'est voulu ?


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#10 Le 01/10/2015, à 08:22

MicP

Re : Recherche la bonne commande avec Find pour demande particulière

smile EDIT : Grillé par moko138 pour l'astérisque (j'étais en train de rédiger mon message) smile

=======
Si ce n'est qu'elle cherche aussi à supprimer les répertoires cache et .config, et qu'elle n'utilise pas find, (comme demandé dans le titre),
je trouve celle de Watael simple et efficace.
Il ne lui manquerait qu'un astérisque à la fin :

rm -rf /home/*/{.config,cache}/*

=======
Pour find, on pourrait aussi utiliser les opérations binaires => … -name .config -or -name cache …

Dernière modification par MicP (Le 01/10/2015, à 08:27)

Hors ligne

#11 Le 01/10/2015, à 09:39

T-800

Re : Recherche la bonne commande avec Find pour demande particulière

Ok merci a vous, j'ai le résultat qu'il faut, quand je disais "find" c'est parceque je pensais qu'on était obligé d'en utiliser un mais évidemment j'accepte aussi sans find si le résultat revient au même.

voici donc la solution qui marche (j'ai pas testé ceux avec les find, ça doit être bon aussi je pense) :

rm -rf /home/*/*/perso/{.config,cache}/*

Hors ligne