Réponses:
Pour répondre directement à votre question, "non - vous ne pouvez pas faire ce que vous décrivez rm
".
Vous pouvez cependant le faire en le combinant find
. Voici l'une des nombreuses façons de procéder:
# search for everything in this tree, search for the file pattern, pipe to rm
find . | grep <pattern> | xargs rm
Par exemple, si vous souhaitez supprimer tous les fichiers * ~, vous pouvez donc ceci:
# the $ anchors the grep search to the last character on the line
find . -type f | grep '~'$ | xargs rm
Pour développer à partir d'un commentaire * :
# this will handle spaces of funky characters in file names
find -type f -name '*~' -print0 | xargs -0 rm
find | grep | xargs rm
. S'il y a des fichiers avec des espaces (ou des nouvelles lignes), cela se cassera (et selon les noms de fichiers et l'emplacement des espaces) pourrait supprimer des éléments que vous n'aviez pas l'intention de supprimer. find … -print0 | xargs -0 rm
sera beaucoup plus robuste. Cela signifie cependant que vous ne pouvez pas utiliser grep
et devez utiliser find
les prédicats de pour faire correspondre et imprimer uniquement les fichiers souhaités. le deuxième exemple de warren sera plus robuste que find -type f -name '*~' -print0 | xargs -0 rm
.
"sans utiliser d'autres commandes"
Non.
En utilisant Bash, avec globstar
set, oui :
rm basedir/**/my*pattern*
Essayez-le avec, par exemple, d' ls -1
abord, avant rm
de répertorier les fichiers que vous correspondez.
Vous définissez les options par exemple shopt -s globstar
.
Alternativement, une find
variante plus courte :
find -type f -name 'my*pattern*' -delete
ou pour GNU find
:
find -type f -name 'my*pattern*' -exec rm {} +
ou une autre alternative pour non-GNU find
(un peu plus lent):
find -type f -name 'my*pattern*' -exec rm {} \;
Pour supprimer également les répertoires, comme vous le demandez: changez simplement rm
en rm -r
dans les commandes ci-dessus et ignorez la correspondance uniquement -type f
dans les find
commandes.
J'aurais aspiré "rm -rf" où se trouve une combinaison de noms de fichiers et de modèles correspondants tels que * et? etc (par exemple todays_log_2009 ????. log). Cela commencera à partir du répertoire actuel et diminuera de manière récursive les fichiers qui correspondent à ce modèle.
Si vous utilisez zsh (1) , activez "extension globale" avec setopt extendedglob
dans .zshrc. Préfixer le motif avec '** /' supprimera alors récursivement:
% rm -rf ** / <modèle>
Cependant, s'il y a beaucoup de fichiers à supprimer, vous devez recourir à find (1) avec xargs (1) ou -exec, et je recommande également de le faire dans les scripts shell.