Primeiro, preciso observar que a análise de ls geralmente não é recomendada. Sua saída é destinada ao consumo humano, e esta solução falhará em alguns nomes de arquivos legítimos (como aqueles que contêm caracteres de nova linha, por exemplo)
Com isso dito, a solução mais simples parece estar usando ls (pois find não oferece uma opção de classificação por data de modificação). Para isso, você pode usar pipes e o comando xargs para executar a renomeação final.
Resumindo:
ls -1t | head -n5 | xargs -I {} rename 's/ /_/g' {}
Isso usa quase exatamente o comando original, mas com xargs para a conclusão final. xargs aceitará vários argumentos separados por nova linha e passará todos eles para um único comando rename .
Advertências
Isso deve funcionar, mas analisar ls é frágil. Isso é interrompido para nomes de arquivos que contêm o caractere de nova linha; usar um comando que serve para analisar como find seria muito melhor.
No entanto, não sei como classificar pela data da última modificação com find . Se alguém souber como fazer isso, você provavelmente terminará com algo como:
find . -mindepth 1 -maxdepth 1 -print0 | sort <???> -Z | head -z -n5 | xargs -0 rename 's/ /_/g'
Se <???> fosse um argumento válido, essa cadeia de comando informaria find aos arquivos de saída no diretório atual separados por um caractere NUL e, em seguida, sort , head e xargs aceitariam isso como o deliminador em vez de uma nova linha - tornando todo o processo muito mais consistente. Sinta-se à vontade para comentar ou editar isso se você souber como fazer isso e quiser substituir a ls answer por essa parte inferior.