Comment supprimer des fichiers sur la ligne de commande avec des expressions régulières?


18

Disons que j'ai 20 fichiers nommés FOOXX, où XX est le numéro du fichier, par exemple 01, 02 etc.

Pour le moment, si je veux supprimer tous les fichiers inférieurs au nombre 10, c'est facile et j'utilise simplement un caractère générique, par exemple rm FOO0 *

Cependant, si je veux supprimer des fichiers spécifiques dans une plage, par exemple 13-15, cela devient plus difficile.

rm FPP [13-15] ne fonctionne pas et me demande si je souhaite supprimer tous les fichiers. Likewse rm FOO1 [3-5] souhaite supprimer tous les fichiers commençant par FOO1

Alors, quelle est la meilleure façon de supprimer des plages de fichiers comme celle-ci?

J'ai essayé avec bash et zsh, et je ne pense pas qu'ils diffèrent tellement pour une tâche aussi basique?


"... rm FOO1 [3-5] souhaite supprimer tous les fichiers commençant par FOO1" Cela n'a aucun sens et n'est certainement pas le cas ici.
Ignacio Vazquez-Abrams

@Ignacio ouais - J'aimerais voir le jeu de caractères a cet ordre de classement!
kmarsh

Réponses:


31

En bash, vous pouvez utiliser:

rm FOO1 {3..5}

ou

rm FOO1 {3,4,5}

pour supprimer FOO13, FOO14 et FOO15.

L'accolade des extensions Bash est documentée ici .


2
Ou même rm FOO{13..15}.
Ignacio Vazquez-Abrams

Est-ce également vrai pour ZSH?
Jack

@Jack: Oui, ça l'est.
pause jusqu'à nouvel ordre.

@Jack: les bashcommandes forment un sous-ensemble de zcommandes shell.
abhinavkulkarni

J'ai donc besoin d'apprendre la syntaxe regex et globbing. Boohoo. :)
Aditya MP

13

Pour les futurs lecteurs, la findcommande peut également supprimer des fichiers. Je me suis installé sur ce problème similaire:

find . -type f -regex '...' -delete

mais la réponse choisie est la réponse la plus simple à cette question.


La réponse choisie n'est valable que pour les fichiers qui suivent une convention de dénomination. Grâce à votre réponse, j'ai pu supprimer tous les fichiers objets d'un répertoire. (dans mon cas, je suis juste allé avec find . -name "*.o" -deleteet cela a fonctionné comme un charme)
John Hamilton

6

ls | grep regex | xargs rm


6
Vous devez utiliser find -regex ... -print0 | xargs -0 ...pour cela, sinon il échoue pour les noms de fichiers avec des espaces.
pause jusqu'à nouvel ordre.

1
Bien sûr, si vous allez utiliser, findvous pouvez tout aussi bien utiliser -exec.
Ignacio Vazquez-Abrams

Dans mon cas, les fichiers avaient des espaces, et la modification du délimiteur résout le problème des espaces: ls | grep regex | xargs --delimiter = '\ n' rm
Anake


@evilsoup, +1 pour l'ajout de cet avertissement, mais qui insère une nouvelle ligne dans un nom de fichier?
Iulian Onofrei
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.