find -exec no funciona correctamente, ¿por qué?

1

Estoy tratando de enumerar todos los nombres de archivo (el nombre base, no la ruta completa) debajo de mi directorio de inicio usando find. Traté de hacer:

find ~/ -type f -exec echo $(basename "{}") ";"

Sin embargo, termino teniendo una lista de rutas completas, y no solo de los nombres básicos como me gustaría. Ahora uso echo, pero idealmente el resultado de $(basename "{}")debería ser el argumento de alguna otra función que quiero escribir.

¿Por qué la función basename no se aplica correctamente?

lucacerona
fuente
en realidad esto estaba en stackoverflow ... stackoverflow.com/questions/15627446/… ¡ perdón por la publicación redundante!
lucacerone

Respuestas:

3

El shell está interpretando el $(...)antes de que se ejecute find. Si desea que el shell de búsqueda lo ejecute, deberá detener la sustitución de bash. Podemos hacer eso así:

find ~/ -type f -exec sh -c 'echo $(basename "{}")' \;

La clave aquí son las comillas simples; Bash no tocará nada dentro de esos.

Oli
fuente
¡Gracias! La mejor explicación que encontré (no sabía la diferencia entre comillas simples y dobles, y mostrarla en modo de depuración realmente marcó la diferencia para mí): stackoverflow.com/questions/2428628/…
lucacerone