--- name: delete_chrome_profile kind: function lang: bash domain: browser version: "1.0.0" purity: impure signature: "delete_chrome_profile --user-data-dir --profile [--profile ]... [--dry-run]" description: "Borra por completo uno o varios perfiles Chrome/Chromium: elimina la carpeta del perfil del disco y limpia todas sus referencias en Local State (info_cache, profiles_order, last_active_profiles, last_used, variations_google_groups). Requiere que Chromium esté cerrado. Hace backup automático de Local State antes de editar y valida el JSON resultante restaurando el backup si es inválido." tags: [navegator, chromium, profile, cleanup, browser, scraping] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] tested: false tests: [] test_file_path: "" file_path: "bash/functions/browser/delete_chrome_profile.sh" params: - name: --user-data-dir desc: "Ruta raíz del user-data-dir de Chrome/Chromium (obligatorio). Ej: ~/.config/chromium" - name: --profile desc: "Nombre de la carpeta del perfil a borrar (repetible, mínimo uno obligatorio). Ej: 'Default', 'Profile 1'" - name: --dry-run desc: "Muestra qué carpetas borraría y qué claves de Local State quitaría sin tocar nada. No activa el guard de chromium cerrado." output: "JSON en stdout. Modo real: {deleted:[{profile, dir_removed, local_state_cleaned}...], last_used:'', backup:'Local State.bak.YYYYMMDD'}. Modo dry-run: {dry_run:true, would_delete:[{profile, dir_exists, would_remove, local_state_would_clean}...]}. Errores a stderr con exit != 0." --- ## Ejemplo ```bash # Cerrar Chromium primero (OBLIGATORIO en modo real) pkill -TERM chromium # Borrar un perfil source $HOME/fn_registry/bash/functions/browser/delete_chrome_profile.sh delete_chrome_profile \ --user-data-dir "$HOME/.config/chromium" \ --profile "Profile 1" # Salida: {"deleted":[{"profile":"Profile 1","dir_removed":true,"local_state_cleaned":true}],"last_used":"Default","backup":"Local State.bak.20260606"} # Borrar varios perfiles a la vez delete_chrome_profile \ --user-data-dir "$HOME/.config/chromium" \ --profile "Profile 1" \ --profile "Profile 2" # Previsualizar sin tocar nada (no requiere Chromium cerrado) delete_chrome_profile \ --user-data-dir "$HOME/.config/chromium" \ --profile "Profile 1" \ --dry-run # Salida: {"dry_run":true,"would_delete":[{"profile":"Profile 1","dir_exists":true,"would_remove":true,"local_state_would_clean":true}]} # Con un user-data-dir sintético para pruebas mkdir -p /tmp/test_udd/Default /tmp/test_udd/"Profile 1" echo '{"profile":{"info_cache":{"Default":{},"Profile 1":{}},"profiles_order":["Default","Profile 1"],"last_active_profiles":["Profile 1"],"last_used":"Profile 1"},"variations_google_groups":{}}' \ > "/tmp/test_udd/Local State" delete_chrome_profile --user-data-dir /tmp/test_udd --profile "Profile 1" --dry-run ``` También ejecutable directamente con `fn run`: ```bash cd $HOME/fn_registry ./fn run delete_chrome_profile_bash_browser -- \ --user-data-dir "$HOME/.config/chromium" --profile "Profile 1" --dry-run ``` ## Cuando usarla Úsala cuando necesites limpiar completamente un perfil de Chromium: antes de crear un perfil de scraping fresco, para depurar problemas de perfiles corruptos, o para liberar espacio eliminando perfiles de sesión temporales. A diferencia de borrar solo la carpeta, esta función también retira las referencias de `Local State` para que Chromium no muestre el perfil fantasma ni intente acceder a él al arrancar. ## Gotchas - **Chromium DEBE estar cerrado antes de ejecutar en modo real**. Chromium reescribe `Local State` desde memoria al cerrar y desharía todos los cambios. La función comprueba `pgrep -x chromium` y aborta con exit 2 si detecta procesos vivos. En `--dry-run` este check no se activa. - **Operación destructiva e irreversible**: todos los datos del perfil (cookies, logins guardados, historial, caché, contraseñas) se pierden permanentemente al borrar la carpeta. No hay papelera. - **Backup automático de Local State**: antes de editar, la función crea `/Local State.bak.YYYYMMDD`. Si ya existe un backup del día no lo sobreescribe. Restaurar manualmente: `cp "Local State.bak.YYYYMMDD" "Local State"`. - **Validación JSON tras edición**: si el JSON de Local State queda inválido (raro pero posible con perfiles con nombres muy especiales), la función restaura el backup automáticamente y sale con exit != 0. - **Nombres de perfil con espacios**: los nombres como `"Profile 1"` se pasan entre comillas al script Python. El parsing usa `json.loads` por lo que los espacios no dan problemas, pero deben pasarse correctamente en el shell: `--profile "Profile 1"`. - **python3 > jq > warning**: usa python3 para editar Local State, jq como fallback. Si ninguno está disponible, las carpetas se borran pero Local State queda sin modificar (Chromium podría mostrar perfiles fantasma al arrancar). - **last_used reasignado automáticamente**: si el perfil borrado era el `last_used`, la función asigna el primer perfil restante en `info_cache`. Si no queda ningún perfil, `last_used` queda como cadena vacía. - **No afecta a `--profile Default` si es el único perfil**: lo borrará igualmente — Chromium puede quedar sin ningún perfil configurado y recreará Default al arrancar. ## Exit codes | Código | Significado | |--------|-------------| | 0 | Éxito o dry-run completado | | 1 | Argumento inválido, directorio o Local State no encontrado, JSON inválido tras edición | | 2 | Chromium está corriendo (solo en modo real) |