Je souhaite supprimer tous les fichiers contenant la chaîne foo
. Comment puis-je faire cela en utilisant bash sous Linux?
linux
command-line
bash
find
Kitsos
la source
la source
foo
(par exemplemyfoo.jpg
), ou les fichiers qui contiennent la séquence d'octetsfoo
(qui peuvent inclure des fichiers binaires qui contiennent justement cette séquence d'octets)?Réponses:
Voici un moyen sûr:
-l
imprime les noms de fichiers des fichiers correspondant au modèle de recherche.-r
effectue une recherche récursive du modèlefoo
dans le répertoire donné.
. Si cela ne fonctionne pas, essayez-R
.-I
(majusculei
) fait sauter les fichiers binaires comme les PDF.-Z
garantit que les noms de fichiers sont terminés à zéro (c'est-à-dire nul) afin qu'un nom contenant un espace blanc ne soit pas interprété de la mauvaise façon (c'est-à-dire comme plusieurs noms au lieu d'un).xargs -0
alimente les noms de fichiers degrep
àrm -f
, en séparant les mots par zéro (nul) octets (rappelez-vous l'-Z
option degrep
).--
est souvent oublié mais il est très important de marquer la fin des options et de permettre la suppression des fichiers dont le nom commence par-
.Si vous souhaitez voir quels fichiers sont sur le point d'être supprimés, supprimez simplement la
| xargs -0 rm -f --
pièce et désactivez l'Z
optiongrep
.Un autre utilisateur a suggéré quelque chose comme ce qui suit, que vous ne devez pas exécuter car il n'est pas sûr:
Si j'ai des fichiers
ImportantStuff
que je ne veux pas supprimer etobsolete ImportantStuff
contenirfoo
, alors je perdsImportantStuff
(et pasobsolete ImportantStuff
!) Lorsque j'exécute cette commande, car elle$files
se décompose dans les espaces lorsqu'elle est interprétée. Il est dangereux de mettre une liste de noms de fichiers dans une variable shell scalaire de cette manière.la source
Cela recherche récursivement les fichiers contenant
foo
. Le second-exec
n'est exécuté que si le premier seexec
termine avec succès, c'est-à-dire s'ilgrep
correspond. Dryrun et retirez leecho
si la sortie semble correcte.Ou bien
et
comme suggéré par Lekensteyn.
la source
find -type f -exec grep -q 'foo' {} \; -delete
(les guillemets autour{}
sont redondants,find
est également capable de supprimer des fichiers.). Notez quegrep
accepte une expression régulière. Si vous souhaitez rechercherfoo.bar
, échappez à cela ou passez l'-F
option pour traiter le modèle comme littéral.-exec echo rm "{}" \;
et non-delete
?-delete
. Il est juste plus facile de démontrer avec le second-exec
et l'écho en place.-print
(ou-ls
pour plus de verbosité) que-exec echo rm "{}" \'
. Pas besoin d'utilitaires externes.Je ferais ce que dit Adrian,
Mais j'ajouterais des limites de mots autour du foo afin de ne pas supprimer accidentellement les fichiers contenant des "aliments" (à moins qu'il ne supprime tout ce qui contient des aliments, c'est ce que vous voulez.)
en fait, je redirigerais la sortie avant de la supprimer afin de pouvoir l'examiner avant de la supprimer:
la source