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