Si vous souhaitez supprimer tous les fichiers dont les noms correspondent à une forme particulière, un caractère générique (modèle global) est la solution la plus simple. Quelques exemples:
$ rm -f abc.log.* # Remove them all
$ rm -f abc.log.2012* # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]* # Remove all files from the first quarter of 2012
Les expressions régulières sont plus puissantes que les caractères génériques; vous pouvez envoyer la sortie de grep
à rm -f
. Par exemple, si certains des noms de fichiers commencent par "abc.log"
et d'autres par "ABC.log"
, grep
vous permet de faire une correspondance insensible à la casse:
$ rm -f $(ls | grep -i '^abc\.log\.')
Cela posera des problèmes si l'un des noms de fichier contient des caractères amusants, y compris des espaces. Faites attention.
Quand je fais cela, j'exécute la ls | grep ...
commande en premier et je vérifie qu'elle produit la sortie que je veux - surtout si j'utilise rm -f
:
$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)
où se !!
développe à la commande précédente. Ou je peux taper la flèche vers le haut ou Ctrl-P et modifier la ligne précédente pour ajouter la rm -f
commande.
Cela suppose que vous utilisez le shell bash. Certains autres shells, en particulier csh et tcsh et certains shells plus anciens dérivés de sh, peuvent ne pas prendre en charge la $(...)
syntaxe. Vous pouvez utiliser la syntaxe de backtick équivalente:
$ rm -f `ls | grep -i '^abc\.log\.'`
La $(...)
syntaxe est plus facile à lire, et si vous êtes vraiment ambitieux, elle peut être imbriquée.
Enfin, si le sous-ensemble de fichiers que vous souhaitez supprimer ne peut pas être facilement exprimé avec une expression régulière, une astuce que j'utilise souvent est de lister les fichiers dans un fichier texte temporaire, puis de le modifier:
$ ls > list
$ vi list # Use your favorite text editor
Je peux ensuite modifier le list
fichier manuellement, en ne laissant que les fichiers que je souhaite supprimer, puis:
$ rm -f $(<list)
ou
$ rm -f `cat list`
(Encore une fois, cela suppose qu'aucun des noms de fichier ne contient de caractères amusants, en particulier des espaces.)
Ou, lors de l'édition du list
fichier, je peux ajouter rm -f
au début de chaque ligne et ensuite:
$ . ./list
ou
$ source ./list
L'édition du fichier est également l'occasion d'ajouter des guillemets si nécessaire, par exemple en changeant rm -f foo bar
en rm -f 'foo bar'
.