Outros já explicaram o que fazer. Deixe-me explicar o que está acontecendo aqui: o caractere de pipe | não faz um pipeline quando a variável é expandida, mas age como um caractere literal. Portanto, find é executado com os seguintes argumentos:
{"/path/to/webpage", "-type", "f", "|", "grep", "-v", ".svn", "|", ...}
e interpreta | como caminho e reclama que deveria ter aparecido antes da expressão ( -type f ).
Outro grande erro é que você está usando '$cmd' como a única linha de comando. Se $cmd (ou seja, find ... ) tiver êxito e produzir a saída como rm -rf / , ela será executada em seu nome. Tenha sempre cuidado ao coletar dados como código!
Melhoria 1. find ... | grep -v ... é uma maneira ruim de excluir algo da saída: find irá percorrer subdiretórios inteiros chamados .svn , produzir as linhas, apenas para serem descartadas posteriormente. Por que não dizer find para fazer isso diretamente?
find path -type f | grep -v .svn # don't do this
find path -name .svn -prune -o -type f -print # do this instead
Melhoria 2. Ao combinar find e xargs , use sempre -print0 em find e -0 em xargs :
find path ... -print0 | xargs -0 -r grep ... # I'd also recommend -r
ou você pode fazer isso totalmente em grep :
grep --recursive --exclude-dir=.svn pattern path