web-dev-qa-db-fra.com

Supprimer les fichiers avec une chaîne trouvée dans le fichier - Linux CLI

J'essaie de supprimer les e-mails erronés en fonction de la recherche de l'adresse e-mail dans le fichier via Linux CLI.

Je peux récupérer les fichiers avec

find . | xargs grep -l [email protected]

Mais je ne peux pas comprendre comment les supprimer à partir de là car le code suivant ne fonctionne pas.

rm -f | xargs find . | xargs grep -l [email protected]

Merci pour votre aide.

44
Spechal

Pour des raisons de sécurité, je dirige normalement la sortie de find vers quelque chose comme awk et crée un fichier batch avec chaque ligne étant "rm filename"

De cette façon, vous pouvez le vérifier avant de l'exécuter et corriger manuellement les cas Edge étranges difficiles à faire avec une expression régulière

find . | xargs grep -l [email protected] | awk '{print "rm "$1}' > doit.sh
vi doit.sh // check for murphy and his law
source doit.sh
59
Martin Beckett

@Martin Beckett a publié une excellente réponse, veuillez suivre cette directive

solution pour votre commande:

grep -l [email protected] * | xargs rm

Ou

for file in $(grep -l [email protected] *); do
    rm -i $file;
    #  ^ Prompt for delete
done
63
ajreal

Vous pouvez utiliser find's -exec et -delete, il ne supprimera le fichier que si la commande grep réussit. En utilisant grep -q pour qu'il n'imprime rien, vous pouvez remplacer le -q avec -l pour voir quels fichiers contiennent la chaîne.

find . -exec grep -q '[email protected]' '{}' \; -delete
13
OneOfOne

Malgré la réponse sûre de Martin, si vous avez la certitude de ce que vous voulez supprimer, par exemple en écrivant un script, j'ai utilisé this avec plus de succès que tout autre one-liner suggéré avant ici. :

$ find . | grep -l [email protected] | xargs -I {} rm -rf {}

Mais je trouve plutôt par nom:

$ find . -iname *something* | xargs -I {} echo {}
2
cregox

J'ai aimé la solution de Martin Beckett mais j'ai trouvé que les noms de fichiers avec des espaces pouvaient se déclencher (comme qui utilise des espaces dans les noms de fichiers, pfft: D). Je voulais aussi revoir ce qui était apparié, donc je déplace les fichiers appariés vers un dossier local au lieu de simplement les supprimer avec la commande 'rm':

# Make a folder in the current directory to put the matched files
$ mkdir -p './matched-files'

# Create a script to move files that match the grep
# NOTE: Remove "-name '*.txt'" to allow all file extensions to be searched.
# NOTE: Edit the grep argument 'something' to what you want to search for.

$ find . -name '*.txt' -print0 | xargs -0 grep -al 'something' | awk -F '\n' '{ print "mv \""$0"\" ./matched-files" }' > doit.sh

Or because its possible (in Linux, idk about other OS's) to have newlines in a file name you can use this longer, untested if works better (who puts newlines in filenames? pfft :D), version:

$ find . -name '*.txt' -print0 | xargs -0 grep -alZ 'something' | awk -F '\0' '{ for (x=1; x<NF; x++) print "mv \""$x"\" ./matched-files" }' > doit.sh

# Evaluate the file following the 'source' command as a list of commands executed in the current context:
$ source doit.sh

REMARQUE: j'ai rencontré des problèmes où grep ne pouvait pas correspondre à l'intérieur de fichiers ayant un encodage utf-16. Voir ici pour une solution de contournement. Dans le cas où ce site Web disparaît, vous utilisez le drapeau -a de grep qui fait que grep traite les fichiers comme du texte et utilise un modèle d'expression régulière qui correspond à tout premier octet de chaque caractère étendu. Par exemple, pour correspondre à Entité, procédez comme suit:

grep -a 'Entit.e'

et si cela ne fonctionne pas, essayez ceci:

grep -a 'E.n.t.i.t.e'
2
FocusedWolf
rm -f `find . | xargs grep -li [email protected]`

fait mieux le travail. Utilisez `...` pour exécuter la commande afin d'offrir les noms de fichiers contenant le courrier électronique. @ Domain.com (grep -l les répertorie, -i ignore la casse) pour les supprimer avec rm (-f de force/-i de manière interactive).

1
Kastor Stein
find . | xargs grep -l [email protected]

comment enlever:

rm -f 'find . | xargs grep -l [email protected]'
0
marian