Recientemente me enfrenté a la tarea de eliminar todos los archivos / carpetas en un directorio, excepto aquellos que coinciden con un patrón específico. Así que preparé un comando unix de una sola línea para hacer el trabajo. ¿Debe ser solo una línea? Supongo que no, ¡pero definitivamente es más genial así!
Si bien el problema es bastante simple, me sorprendió un poco lo compleja que resultó ser mi solución. Aquí está el comando que usé; NOTA: esta es una solución pobre porque no maneja nombres de archivo que contengan caracteres de avance de línea (lo que no importó en mi situación).
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
No utilicé el comando "buscar" porque no quiero volver a las carpetas que coinciden con PATTERN. Por ejemplo, considere la siguiente estructura de archivos:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
El uso del patrón "foo" solo debe eliminar "first_dir" (y su contenido, por supuesto) y "somefile.txt" ( no "anotherfile.txt" o "morefiles.log").
Pregunta, ¿hay formas mejores (más elegantes y correctas) de lograr esto?
EDITAR:
Hace poco me llamó la atención que "encontrar" puede ser una mejor opción:
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Esta solución maneja correctamente las rutas que contienen caracteres de avance de línea.