Страница man для GNU find содержит следующее:
-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.
Это от человека до find
(GNU findutils) 4.4.2.
Теперь я проверил это с помощью bash и dash, и оба не должны {}
маскироваться. Вот простой тест:
find /etc -name "hosts" -exec md5sum {} \;
Есть ли оболочка, для которой мне действительно нужно маскировать брекеты? Обратите внимание, что это не зависит от того, содержит ли найденный файл пробел (вызывается из bash):
find ~ -maxdepth 1 -type d -name "U*" -exec ls -d {} \;
/home/stefan/Ubuntu One
Это изменяется, если найденный файл передается в подоболочку:
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
которая может быть решена путем:
find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "$0"' {} \;
в отличие от:
find ~ -maxdepth 3 -type d -name "U*" -exec bash -c 'ls -d "{}"' \;
/home/stefan/Ubuntu One
но это не то, о чем идет речь на странице руководства, не так ли? Так какая оболочка относится {}
по-другому?