Récemment, j'ai été confronté à la tâche de supprimer tous les fichiers / dossiers d'un répertoire, à l'exception de ceux correspondant à un modèle spécifique. J'ai donc préparé une commande unix sur une seule ligne pour faire le travail. Doit-il s'agir d'une seule ligne? Je suppose que non, mais c'est définitivement plus cool de cette façon!
Bien que le problème soit assez simple, j'ai été un peu surpris de la complexité de ma solution. Voici la commande que j'ai utilisée; REMARQUE: c'est une mauvaise solution car elle ne gère pas les noms de fichiers contenant des caractères de saut de ligne (ce qui n'avait pas d'importance dans ma situation).
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
Je n'ai pas utilisé la commande "find" car je ne veux pas rentrer dans les dossiers correspondant au MOTIF. Par exemple, considérez la structure de fichiers suivante:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
L'utilisation du modèle "foo" ne doit supprimer que "first_dir" (et son contenu bien sûr) et "somefile.txt" ( pas "anotherfile.txt" ou "morefiles.log").
Question, existe-t-il de meilleures façons (plus élégantes et correctes) d'accomplir cela?
EDIT:
Il a été récemment porté à mon attention que "trouver" peut être une meilleure option:
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Cette solution gère correctement les chemins d'accès contenant des caractères de saut de ligne.