Eu usaria um shell for-loop:
for match in "$(grep -ro '^foo.*')";do
echo mv "${match%:*}" "${match#*:}"
done
Isso itera todos os file:matching-substring
correspondentes e usa os operadores %
e #
string para excluir tudo, resp. tudo depois, e incluindo :
.
Observe que, se você realmente deseja corresponder a linha inteira em oposição a apenas a substring que corresponde ao padrão, use
for match in $(grep -r '^foo');do
Certifique-se de aspas duplas, pois as correspondências e / ou nomes de arquivos podem conter espaços.
Se você deseja corresponder por um padrão, mas renomeie o arquivo para a segunda palavra na linha correspondente:
for match in "$(grep -ro '^foo.*')";do
fname=$("echo ${match#*:}|awk '{print $2}'")
echo mv "${match%:*}" "$fname"
done