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.