A solução mais fácil é usar isso:
find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 perl -pi -w -e 's/AAA/BBB/g'
Eu tenho essa linha
find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 sed -i 's/AAA/BBB/g'
minha intenção é que a partir do diretório atual mude recursivamente todas as ocorrências de AAA para BBB em todos os arquivos, exceto aqueles com as seguintes extensões: .plist, .mp4 e .DS *
mas recebo a mensagem
sed: 1: "./myDir/pro ...": invalid command code .
Ao contrário do GNU sed, o sed fornecido com o Mac OSX requer um argumento para a opção -i
, especificando o sufixo de backup; para suprimir o backup você tem que passar uma string vazia ( ''
). Portanto, sed estava interpretando seu s/AAA/BBB/
como o sufixo de backup e assumindo o nome do seu primeiro arquivo ( ./myDir/pro ...
) como o comando a ser executado. Obviamente, .
não é um comando sed válido, causando o erro. Tendo isso em mente, o seguinte funcionará:
find [...] | xargs -0 sed -i.bak 's/AAA/BBB/g'
Ou, se você insistir em suprimir o backup
find [...] | xargs -0 sed -i '' 's/AAA/BBB/g'