web-dev-qa-db-fra.com

Supprimer tous les fichiers avec un motif

J'ai des milliers de fichiers txt dans un dossier. Beaucoup d'entre eux ne sont pas nécessaires pour moi. Je veux supprimer tous les fichiers inutiles à la fois. Si je le fais manuellement (en ouvrant chaque fichier, voir son contenu et le supprimer), cela demandera beaucoup de temps et d'efforts. Mais j'ai certains modèles (certains mots) (les mots sont le contenu du fichier, pas le nom du fichier) que les fichiers inutiles ont. Mes fichiers requis n'ont pas ces modèles. Ainsi, les fichiers inutiles peuvent être filtrés et supprimés à l'aide de ces modèles.

J'ai joint une capture d'écran d'un fichier inutile pour une meilleure compréhension. Le mot en surbrillance peut être utilisé comme modèle. this

1
user769185

Vous pouvez utiliser les commandes grep et xargs de la manière suivante:

grep -rlZ '=head1 NAME' /target-directory/ | xargs -0 rm -f

La commande grep fonctionnera récursivement -r (Dans le /target-directory/) Et affichera uniquement les noms des fichiers -l Qui contiennent le motif '=head1 NAME'. L'option -Z Produira un octet nul (le caractère ASCII NUL) au lieu du caractère qui suit normalement un nom de fichier.

Cette sortie sera redirigée | Vers le stdin de la commande xargs-0 Signifie que les éléments d'entrée seront terminés par un caractère nul à la place de par des espaces. La commande qui sera exécutée est rm -f Qui signifie forcer la suppression .

Merci à @ steeldriver pour l'amélioration finale de la réponse!


De plus, vous pouvez ajouter -L1 (Lire une ligne par exécution) à la commande xargs et echo pour effectuer un essai à sec:

grep -rlZ '=head1 NAME' /target-directory/ | xargs -L1 -0 echo rm -f

Si vous souhaitez déplacer les fichiers quelque part au lieu de les supprimer, modifiez la commande dans de cette façon :

grep -rlZ '=head1 NAME' /tgt-dir/ | xargs -L1 -0 -I {} echo mv {} /destination-dir/

Ou comme @ PerlDuck dit "mv a aussi un interrupteur -t, --target-directory=DIRECTORY Qui permet de mettre le répertoire en premier et les fichiers en dernier ... De cette façon mv n'est pas appelé une fois pour chaque fichier mais une fois pour un tas de fichiers. ":

grep -rlZ '=head1 NAME' /tgt-dir/ | xargs -0 echo mv -t /destination-dir/
2
pa4080