La página del manual para GNU find states:
-exec command ; [...] The string `{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\') or quoted to protect them from expansion by the shell.
Eso es del hombre a find
(GNU findutils) 4.4.2.
Ahora probé esto con bash y dash, y no es necesario que ambos {}
estén enmascarados. Aquí hay una prueba simple:
find /etc -name "hosts" -exec md5sum {} \;
¿Hay un caparazón, para el cual realmente necesito enmascarar los frenos? Tenga en cuenta que no depende de si el archivo encontrado contiene un espacio en blanco (invocado desde bash):
find ~ -maxdepth 1 -type d -name "U*" -exec ls -d {} \;
/home/stefan/Ubuntu One
Esto cambia si el archivo encontrado se pasa a una subshell:
find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d {}' \;
ls: cannot access /home/stefan/Ubuntu: No such file or directory
ls: cannot access One: No such file or directory
que puede resolverse mediante:
find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "$0"' {} \;
en contraste con:
find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "{}"' \;
/home/stefan/Ubuntu One
pero eso no es de lo que habla la página man, ¿verdad? Entonces, ¿qué shell trata {}
de una manera diferente?