Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿find dice “paths must precede expression”? Demuestra la expansión del shell antes de reescribir el comando

El error suele indicar que el shell o un contenedor cambió la lista de argumentos antes de que find la analizara; no demuestra que la ruta inicial esté mal. Captura el argv exacto, separa puntos de inicio y expresión, cita los patrones destinados a find y prueba cero, una y varias coincidencias antes de cualquier acción destructiva.

Ilustración de un comodín sin comillas que se expande a varios argumentos antes de que find los analice
Ilustración: inspecciona el vector de argumentos recibido por find, no solo el comando escrito. Watch at Ease

El mensaje significa que find no pudo mantener un límite claro entre los puntos de inicio recibidos y la expresión. Por sí solo no demuestra que el directorio anterior a -name sea incorrecto.

La evidencia más valiosa es el vector de argumentos exacto. Demuestra qué entregó el shell o contenedor, clasifica cada token y valida la corrección con cero, una y varias coincidencias antes de restaurar acciones que cambian archivos.

1. Conserva el comando exacto y el límite de argv

Registra shell, directorio de trabajo, versión de find, comando exacto, estado de salida y stderr. En una reproducción segura imprime cada argumento citado por separado; no copies secretos al registro ni reconstruyas con eval.

Un comando visualmente igual puede llegar distinto mediante shell interactivo, script, alias, variable o herramienta de compilación, por lo que el texto mostrado no basta.

2. Reproduce cero, una y varias coincidencias

Prueba el mismo patrón en un directorio inofensivo. Un *.txt sin comillas puede quedar como una palabra, expandirse a una ruta y parecer correcto, o expandirse a varias rutas que find interpreta como puntos de inicio extra.

Cita o escapa el patrón que debe comparar find. Registra como evidencia las diferencias de Bash, zsh y otros shells cuando no hay coincidencias; no adivines la reparación.

3. Clasifica cada token como ruta o expresión

Escribe un argumento por fila. Marca primero rutas iniciales reales, después pruebas como -name y acciones como -print. Comprueba la aridad documentada de cada primary.

No muevas todos los tokens desconocidos al principio. Verifica si son ruta, opción, operando de prueba, agrupador o acción para la implementación instalada.

4. Conserva límites en variables y contenedores

En Bash, una expansión de parámetro sin comillas puede sufrir división de palabras y expansión de rutas. Prefiere arrays para varios argumentos, cita escalares que deban seguir siendo uno e inspecciona alias, funciones, servicios y sustituciones por separado.

No repares con eval ni una sola cadena concatenada. Volver a analizar cambia espacios y comodines y puede abrir una vía de inyección.

5. Demuestra la corrección antes de acciones destructivas

Sustituye primero las acciones por -print y verifica cero, una y varias coincidencias, además de nombres con espacios y guiones iniciales. Confirma el mismo argv desde el programador real.

Solo entonces restaura -delete, -exec u otra acción mutante en un conjunto pequeño y con reversión. Acepta cuando desaparezca el diagnóstico, el conjunto sea correcto y ningún token cambie de papel.

Diagrama conceptual que separa expansión del shell, rutas iniciales, expresión de find y límites del contenedor
Ilustración: clasifica cada token por función y valida la reparación con casos de solo impresión. Watch at Ease