for file in /dir/*.txt; do
mv "$file" "${file%_*}_Others.txt"
done
O ${file%_*}
é uma forma de expansão de parâmetro do shell que removerá tudo do último _
e on.
Eu tenho os seguintes arquivos em um diretório:
GE.AARS_vs_Control16.txt
GE.DHX30_vs_Control18.txt
GE.DNAJC2_vs_Control18.txt
Gostaria de remover o *_Control<numeric>
e substituí-lo por *_Others
, de modo que os arquivos sejam renomeados como
GE.AARS_vs_Others.txt
GE.DHX30_vs_Others.txt
GE.DNAJC2_vs_Others.txt
Usando a ferramenta Perl rename
, supondo que você esteja no mesmo diretório que os arquivos a renomear:
rename 's/_Control1[68]/_Others/' GE.*_Control1[68].txt
Se você gosta de um pouco de ofuscação, aqui está outra maneira:
paste <(ls) <(ls | sed 's/_Control1[68]/Others') | sed 's/^/mv /' | bash
Primeiro, tente executar o pipeline sem o bash :-) Estou assumindo que não há outros arquivos no diretório. Se houver, substitua cada ls
por ls *Controll1[68].txt
ou algo assim para limitar a lista.
"I'd rather write programs that write programs than write programs" - Richard Sites
(Eu poderia jurar que era Alan Perlis, mas o Google não concorda).