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
Bonjour,

j exécute cette commande pour effacer tout les fichier dans un répertoire

rm /home/répertoire *

mais je veux un commande pour supprimer tout les fichier Sauf pour un seul fichier

et mrci

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
Alors pour commencer, il y a une erreur dans ta commande, c'est plutôt :

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
0
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
Salut,
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 -delete
Affiche 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.
0
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
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 ! )
0