Je souhaite supprimer les fichiers qui n'ont pas la chaîne «999» (sans le «») dans leur nom.
J'ai essayé:
grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --
Mais aucun ne fonctionne. J'utilise macOS Sierra, avec bash: 3.2.57.
grep -l
le fait lister les fichiers où une correspondance a été trouvée (ou introuvable avec-v
) dans le contenu , pas le nom de fichier.grep
correspond toujours au contenu des fichiers que vous spécifiez, jamais à leurs noms.Réponses:
Utilisation d'un modèle de globalisation étendu dans
bash
:Cela doit
shopt -s extglob
être activé (et pour des raisons de sécurité égalementshopt -s failglob
, afin qu'aucun fichier portant le nom inhabituel ne!(*999*)
soit supprimé par erreur si tous les noms de fichiers contiennent999
). Le modèle!(*999*)
correspondra à n'importe quel nom du répertoire actuel, à l'exception des noms correspondants*999*
. Pour supprimer également les fichiers cachés (fichiers dont le nom commence par un point ), activez également l'dotglob
option.Pour ne vous soucier que des fichiers normaux ou des liens symboliques vers des fichiers normaux (pas des répertoires, etc.):
Le
zsh
shell équivalent à la boucle ci-dessus seraitVotre première commande ne fonctionnera pas puisqu'elle
grep
regardera à l'intérieur des fichiers. Il supprimerait tous les fichiers contenant des lignes sans999
(si vous aviez ajouté l'--null
option pour que cela fonctionne avecxargs -0
).Votre deuxième commande ne fonctionnera pas car
grep
sur macOS ne prend pas en charge--null-data
(elle a cependant une--null
option, mais uniquement pour la génération de sortie de nom de fichier). Notez également qu'il rechercherait999
n'importe où dans le chemin du fichier (y compris les composants du répertoire), pas seulement le nom du fichier.la source
failglob
option ou cela pourrait finir par supprimer le fichier appelé!(*999*)
s'il n'y a pas d'autre fichier dont le nom ne contient pas999
.Inversez simplement la condition de nom dans
find
:Ajoutez
-delete
ou-exec rm {} +
supprimez réellement les fichiers correspondants.la source
!
est en sécuritébash
.