Si vous souhaitez supprimer tous les fichiers dont les noms correspondent à une forme particulière, un caractère générique (modèle glob) 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 alimenter la sortie de grep
à rm -f
. Par exemple, si certains noms de fichiers commencent par "abc.log"
et certains avec "ABC.log"
, grep
vous permet de faire une correspondance insensible à la casse :
$ rm -f $(ls | grep -i '^abc\.log\.')
Cela causera des problèmes si l'un des noms de fichiers contient des caractères amusants, y compris des espaces. Soyez prudent.
Quand je fais cela, je lance le ls | grep ...
commande d'abord et vérifiez 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 flèche vers le haut ou Ctrl-P et modifier la ligne précédente pour ajouter le rm -f
commande.
Cela suppose que vous utilisez le shell bash. Certains autres shells, en particulier csh et tcsh et certains anciens shells dérivés de sh, peuvent ne pas prendre en charge le $(...)
syntaxe. Vous pouvez utiliser la syntaxe de backtick équivalente :
$ rm -f `ls | grep -i '^abc\.log\.'`
Le $(...)
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 consiste à répertorier les fichiers dans un fichier texte temporaire, puis à le modifier :
$ ls > list
$ vi list # Use your favorite text editor
Je peux alors éditer 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 fichiers 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 puis :
$ . ./list
ou
$ source ./list
La modification du fichier est également l'occasion d'ajouter des guillemets si nécessaire, par exemple en modifiant rm -f foo bar
à rm -f 'foo bar'
.
Utilisez simplement la sélection multiligne dans sublime pour combiner tous les fichiers en une seule ligne et ajoutez un espace entre chaque nom de fichier, puis ajoutez rm
au début de la liste. Ceci est surtout utile lorsqu'il n'y a pas de modèle dans les noms de fichiers que vous souhaitez supprimer.
[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10
Bash prend en charge toutes sortes de caractères génériques et d'extensions.
Votre cas exact serait traité par l'expansion des accolades, comme ceci :
$ rm -rf abc.log.2012-03-{14,27,28}
Ce qui précède serait étendu à une seule commande avec les trois arguments, et équivaut à taper :
$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28
Il est important de noter que cette expansion est effectuée par le shell, avant rm
est même chargé.
Utilisez un caractère générique (*
) pour faire correspondre plusieurs fichiers.
Par exemple, la commande ci-dessous supprimera tous les fichiers dont le nom commence par abc.log.2012-03-
.
rm -f abc.log.2012-03-*
Je recommanderais d'exécuter ls abc.log.2012-03-*
pour lister les fichiers afin que vous puissiez voir ce que vous allez supprimer avant d'exécuter le rm
commande.
Pour plus de détails, consultez la page de manuel de Bash sur l'expansion des noms de fichiers.