Grep avec rm

Résolu/Fermé
enyrix Messages postés 145 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 - Modifié par enyrix le 26/02/2015 à 15:15
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 28 févr. 2015 à 16:14
Bonjour,
J'aimerais rechercher une chaine de caractère dans des fichiers, pour les fichiers possédant cette chaine de caractère j'aimerais pouvoir effacer ces fichiers avec confirmation avant en pouvant voir le contenu.

Pour rechercher dans les fichier j'utilise:
grep -r "salut" .

Ce qui donne par exemple:
./test:abc salut
./test2:test salut 2

J'aimerais effacer ./test et ./test2 avec confirmation.

Il aurait pas une commande a faire du genre qui fonctionnerait ?
grep -r "salut" . | xargs rm


J'ai trouvé ceci qui fonctionne mais sans confirmation:
find . -type f | xargs grep -l "salut" | xargs rm


J'aimerais donc utiliser le rm -i, mais ici à cause du output ça ne fonctionne pas.

Des solutions ?

Merci !

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 28/02/2015 à 16:14
Voici comment tu peux faire :

for x in $(grep -r "salut" /home/toto | cut -d":" -f1); do rm -i "$x"; done


Si tu n'avais pas eu besoin du mode interactif, tu aurais pu écrire :

grep -r "salut" /home/toto | cut -d":" -f1 | xargs rm -f


Le problème c'est qu'avec cette deuxième version, si tu remplaces "-f" par "-i" tu ne pourras pas répondre aux questions de confirmation (car le pipe "parallèlise" les différents appels fait à rm, contrairement à la boucle for qui les déclenche un par un).

Bonne chance
3
enyrix Messages postés 145 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
27 févr. 2015 à 16:33
Merci, c'est en effet ce que je cherchait !
Petite correction par contre, tu as oublié de mettre le path après la chaine grep:
Version testé fonctionnelle:
for x in $(grep -r "salut" /tmp/test | cut -d":" -f1); do rm -i "$x"; done

ou pour le répertoire courant:
for x in $(grep -r "salut" . | cut -d":" -f1); do rm -i "$x"; done
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
28 févr. 2015 à 16:14
Effectivement, je corrige mon message en conséquence, merci pour ta remarque :)
0