grep
retornará uma lista de arquivos. Você precisa executar mv
sobre cada um dos arquivos.
Você pode usar xargs
como sugerido em outra resposta, mas eu prefiro esse tipo de linha:
for file in $(grep -l "123" $1/*); do mv $file $2; done
Ele itera sobre a lista de arquivos retornados por grep
e os move um por um.
Pode ser necessário adicionar alguma verificação de erros, por isso aqui está uma versão mais legível:
for file in $(grep -l "123" $1/*); do
mv $file $2;
done
Além disso, acho que geralmente é uma boa idéia mudar a variável IFS antes desse tipo de loop
export IFS=$'\n'
Dessa forma, você evitará muitos problemas com arquivos que tenham espaço em branco no nome (a menos que eles tenham um caractere de nova linha incorporado).