Disons que j'ai un répertoire avec plusieurs fichiers, qui sont tous soit des fichiers binaires (fichiers sans extensions déclarées) et des fichiers source (.c
extension). Je fais ceci :
$ ls
et obtenez :
README.md hello-world.c hello-world get-name.c get-name
et je veux lister uniquement les fichiers avec une extension spécifique (dites à la fois .c
et .md
), je fais :
ls *.c *.md
et c'est bon !
Mais que se passe-t-il si maintenant je veux supprimer tous les fichiers qui ne le font pas avoir un .c
ou .md
extension, comment puis-je faire cela ?
Je sais comment le faire pour les fichiers dont les extensions me sont connues, comme :
ls *.c *.md | xargs rm
Mais comment dire à la ligne de commande de supprimer les fichiers qui NE PAS correspond à mes critères ?
Réponse acceptée :
Utilisez find
:
find -maxdepth 1 ! -name "*.c" -print0 | xargs -0 ...
Notez que -maxdepth
, -print0
, -r
et -0
se trouvent dans quelques find
implémentations (ont été introduites par GNU find
/xargs
) mais ne sont pas spécifiés par POSIX. Une autre façon est, comme Stéphane l'a mentionné dans son commentaire, d'utiliser le -exec
action de trouver - n'oubliez pas d'utiliser la commande -exec command {} +
forme, car il réduit considérablement le nombre d'invocations de command
(il doit autoriser la syntaxe où les noms de fichiers sont placés à la fin, sinon vous devez envelopper la command
dans un sh -c
appel).
Alternativement grep
la sortie de ls
ls | grep -v ".c$" | xargs ...
Vous pouvez filtrer plusieurs extensions soit avec des expressions régulières :
... | grep -v ".(c|md)$" | ...
avec des expressions régulières étendues :
... | grep -Ev ".(c|md)$" | ...
avec l'option de chaînes fixes (ne correspondra pas uniquement à la fin du nom de fichier !) :
... | grep -vF ".c
.md" | ...
ou en enchaînant plus de grep
s :
... | grep -v ".c$" | grep -v ".md$" | ...
Cela dit, find
est probablement la meilleure option, car avec le -print0
option il gère tous les caractères possibles dans les noms de fichiers qui pourraient avoir besoin d'être échappés autrement (à condition que votre find
et xargs
sont capables de travailler avec des chaînes terminées par NULL - par ex. les outils GNU le sont).