J'ai cette liste de fichiers sur un serveur Linux:
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
J'ai supprimé les fichiers journaux sélectionnés un par un, en utilisant la commande rm -rf
ci-dessous:
rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28
Existe-t-il un autre moyen de supprimer les fichiers sélectionnés à la fois?
GNU
est nécessaire?Réponses:
Bash prend en charge toutes sortes de caractères génériques et d'extensions.
Votre cas exact serait traité par l' expansion d'accolades , comme ceci:
Ce qui précède se développerait en une seule commande avec les trois arguments et équivaudrait à taper:
Il est important de noter que cette expansion est effectuée par le shell, avant
rm
même d'être chargé.la source
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-
.Je vous recommande de courir
ls abc.log.2012-03-*
pour lister les fichiers afin que vous puissiez voir ce que vous allez supprimer avant d'exécuter larm
commande.Pour plus de détails, reportez-vous à la page de manuel Bash sur l' extension des noms de fichiers .
la source
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:
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: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'utiliserm -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 larm -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: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:
Je peux ensuite modifier le
list
fichier manuellement, en ne laissant que les fichiers que je souhaite supprimer, puis:ou
(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 ajouterrm -f
au début de chaque ligne et ensuite:ou
L'édition du fichier est également l'occasion d'ajouter des guillemets si nécessaire, par exemple en changeant
rm -f foo bar
enrm -f 'foo bar'
.la source
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.la source
Un joker fonctionnerait bien pour cela, bien que pour être sûr, il serait préférable de rendre l'utilisation du joker aussi minime que possible, donc quelque chose du genre:
Bien qu'à première vue, ne s'agit-il que de fichiers uniques? L'option récursive ne devrait pas être nécessaire si aucun de ces éléments n'est un répertoire, il est donc préférable de ne pas l'utiliser, juste pour la sécurité.
la source
Je ne suis pas un gourou de Linux, mais je crois que vous voulez diriger votre liste de fichiers de sortie vers
xargs rm -rf
. J'ai utilisé quelque chose comme ça dans le passé avec de bons résultats. Testez d'abord un exemple de répertoire!EDIT - J'ai peut-être mal compris, sur la base des autres réponses qui apparaissent. Si vous pouvez utiliser des caractères génériques, tant mieux. J'ai supposé que votre liste originale que vous aviez affichée était générée par un programme pour vous donner votre "sélection", donc j'ai pensé que le piping
xargs
serait la voie à suivre.la source
si vous souhaitez supprimer tous les fichiers appartenant à un répertoire à la fois. Par exemple: le nom de votre répertoire est "log" et le répertoire "log" comprend les fichiers abc.log.2012-03-14, abc.log.2012-03-15, ... etc. Vous devez être au-dessus du répertoire du journal et:
la source