Aide avec commande
Fermé
drman
Messages postés
4
Date d'inscription
samedi 29 septembre 2012
Statut
Membre
Dernière intervention
9 décembre 2012
-
9 déc. 2012 à 17:29
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 - 10 déc. 2012 à 21:58
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 - 10 déc. 2012 à 21:58
A voir également:
- Aide avec commande
- Invite de commande - Guide
- Commande terminal mac - Guide
- Commande chkdsk - Guide
- Diskpart commande - Guide
- Commande en cours de validation fnac - Forum Consommation & Internet
2 réponses
mamiemando
Messages postés
33079
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
23 avril 2024
7 749
10 déc. 2012 à 10:49
10 déc. 2012 à 10:49
Alors pour commencer, il y a une erreur dans ta commande, c'est plutôt :
... ou encore
Là tu as écrit quelque chose d'autre : "supprime /home/répertoire et *" sachant que comme tu n'as pas mis de "-r" tu ne peux pas supprimer de dossier (donc /home/répertoire ne sera pas supprimé) et * désigne tout ce qui est dans le répertoire courant. Si tu es par exemple positionné dans /titi/tata, tu vas donc tenter de supprimer tous les fichiers dans /titi/tata !
Revenons à ton problème. La stratégie la plus simple consiste à lister les fichiers de ton dossier par exemple avec la commande find. Ensuite on peut filtrer certaines lignes de ce résultat avec grep et ignorer les lignes qui correspondent à un fichier/au fichier que tu veux garder. Ensuite, pour chaque ligne restante (chacune correspondant à un fichier à supprimer), on déclenche la suppression.
Pour illustrer le propos je vais créer une petite arborescence de fichiers (là je suis dans /home/mando) :
Ok alors supposons que je veuilles garder /home/mando/toto/titi/titi1 et /home/mando/toto/toto2. Avec find on va lister tous les fichiers de données présents dans toto (dans un second temps on dégagera les dossiers vides).
La première manière de lancer find c'est comme ça :
Ok mais nous on veut juste les fichiers de données, donc on va le préciser à find :
On a dit qu'on voulait toto/titi/titi1 et toto/toto2 donc on va filtrer ces deux lignes avec grep (pour faire une barre verticale : alt gr 6, c'est ce qu'on appelle faire un tube ou UN pipe (prononcer païpe)) :
Il ne nous reste plus qu'à déclencher la commande rm pour chacun des fichiers restants :
Et on s'aperçoit que les fichiers ont été supprimés :
Il ne nous reste plus qu'à supprimer de toto les répertoires vides. Pour ça on peut utiliser rmdir qui ne dégage que des répertoires vide (ce qui signifiera qu'elle échouera sur les dossiers non vide, à savoir titi et toto. Même principe que tout à l'heure, on liste les dossiers et on fait le ménage à partir de ce résultat :
Et on a le résultat attendu !
Bonne chance
rm /home/répertoire/*
... ou encore
cd /home/répertoire rm *
Là tu as écrit quelque chose d'autre : "supprime /home/répertoire et *" sachant que comme tu n'as pas mis de "-r" tu ne peux pas supprimer de dossier (donc /home/répertoire ne sera pas supprimé) et * désigne tout ce qui est dans le répertoire courant. Si tu es par exemple positionné dans /titi/tata, tu vas donc tenter de supprimer tous les fichiers dans /titi/tata !
Revenons à ton problème. La stratégie la plus simple consiste à lister les fichiers de ton dossier par exemple avec la commande find. Ensuite on peut filtrer certaines lignes de ce résultat avec grep et ignorer les lignes qui correspondent à un fichier/au fichier que tu veux garder. Ensuite, pour chaque ligne restante (chacune correspondant à un fichier à supprimer), on déclenche la suppression.
Pour illustrer le propos je vais créer une petite arborescence de fichiers (là je suis dans /home/mando) :
(mando@silk) (~) $ mkdir -p toto/titi (mando@silk) (~) $ mkdir -p toto/tata (mando@silk) (~) $ touch toto/toto1 (mando@silk) (~) $ touch toto/toto2 (mando@silk) (~) $ touch toto/toto3 (mando@silk) (~) $ touch toto/titi/titi1 (mando@silk) (~) $ touch toto/titi/titi2 (mando@silk) (~) $ touch toto/tata/tata1
Ok alors supposons que je veuilles garder /home/mando/toto/titi/titi1 et /home/mando/toto/toto2. Avec find on va lister tous les fichiers de données présents dans toto (dans un second temps on dégagera les dossiers vides).
La première manière de lancer find c'est comme ça :
(mando@silk) (~) $ find toto/ toto/ toto/toto3 toto/toto2 toto/toto1 toto/tata toto/tata/tata1 toto/titi toto/titi/titi1 toto/titi/titi2
Ok mais nous on veut juste les fichiers de données, donc on va le préciser à find :
(mando@silk) (~) $ find toto/ -type f toto/toto3 toto/toto2 toto/toto1 toto/tata/tata1 toto/titi/titi1 toto/titi/titi2
On a dit qu'on voulait toto/titi/titi1 et toto/toto2 donc on va filtrer ces deux lignes avec grep (pour faire une barre verticale : alt gr 6, c'est ce qu'on appelle faire un tube ou UN pipe (prononcer païpe)) :
(mando@silk) (~) $ find toto/ -type f | grep -v toto/titi/titi1 | grep -v toto/toto2 toto/toto3 toto/toto1 toto/tata/tata1 toto/titi/titi2
Il ne nous reste plus qu'à déclencher la commande rm pour chacun des fichiers restants :
for x in $(find toto/ -type f | grep -v toto/titi/titi1 | grep -v toto/toto2); do rm $x; done
Et on s'aperçoit que les fichiers ont été supprimés :
(mando@silk) (~) $ find toto/ toto/ toto/toto2 toto/tata toto/titi toto/titi/titi1
Il ne nous reste plus qu'à supprimer de toto les répertoires vides. Pour ça on peut utiliser rmdir qui ne dégage que des répertoires vide (ce qui signifiera qu'elle échouera sur les dossiers non vide, à savoir titi et toto. Même principe que tout à l'heure, on liste les dossiers et on fait le ménage à partir de ce résultat :
(mando@silk) (~) $ find toto/ -type d toto/ toto/tata toto/titi (mando@silk) (~) $ for x in $(find toto/ -type d); do rmdir $x; done rmdir: échec de suppression de « toto/ »: Le dossier n'est pas vide rmdir: échec de suppression de « toto/titi »: Le dossier n'est pas vide
Et on a le résultat attendu !
(mando@silk) (~) $ find toto/ toto/ toto/toto2 toto/titi toto/titi/titi1
Bonne chance
Flachy Joe
Messages postés
2103
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
21 novembre 2023
259
10 déc. 2012 à 21:54
10 déc. 2012 à 21:54
Salut,
la solution de mamiemando fonctionne sûrement mais il y a plus court :
En enlevant l'option -type f alors les dossiers sont supprimés aussi (sauf ceux qui contiennent le fichier indiqué...).
Bonne continuation.
la solution de mamiemando fonctionne sûrement mais il y a plus court :
find /home/répertoire -type f -not -name "nom_du_fichier" -print -deleteAffiche et supprime tous les fichiers dont le nom n'est pas celui indiqué.
En enlevant l'option -type f alors les dossiers sont supprimés aussi (sauf ceux qui contiennent le fichier indiqué...).
Bonne continuation.
Flachy Joe
Messages postés
2103
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
21 novembre 2023
259
10 déc. 2012 à 21:58
10 déc. 2012 à 21:58
Pour info : en règle générale faire une boucle sur une sortie de find n'est pas nécessaire, l'action -exec le fait très bien.
MFIYF ! (man find is your friend ! )
MFIYF ! (man find is your friend ! )