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' {} \;