Com sua versão de find , o {} na string é substituído pelo nome do arquivo. É quase sempre um erro usar {} como parte de uma string, porque o nome do arquivo é inserido assim. Aqui, o nome do arquivo é usado como um fragmento de script de shell. Se houver um diretório chamado a'$(touch wibble)' , seu comando executará o código do shell
pwd; echo 'a'$(touch wibble)''; zip -v 'a'$(touch wibble)'/a'$(touch wibble)'.zip' 'a'$(touch wibble)'/*' -x \*.zip -x \*.id"'
Observe como isso executa o comando touch wibble (quatro vezes).
Você precisa passar o nome do arquivo como um argumento para o snippet do shell. Essa é a única maneira de usar find -exec ou find -execdir para chamar um shell de forma confiável (exceto nos casos em que os nomes de arquivos são restritos para não ter caracteres especiais, incluindo espaços). O primeiro argumento após sh -c SCRIPT pode ser acessado a partir do script como "$0" .
Além disso, zip não aceita curingas em sua lista de arquivos para zip, portanto, o curinga deve ser deixado sem aspas, para ser expandido pelo shell.
find pictures/ -type d -links 2 -execdir sh -c 'pwd; echo "$0"; zip -v "$0/$0.zip" "$0/"* -x \*.zip -x \*.id' {} \;