como remover string em vários nomes de arquivo após um caractere específico?

como remover string em vários nomes de arquivo após um caractere específico?

Tenho vários arquivos em uma pasta com este formato de nome

01. file one-sdvanv-12lknl.srt
01. file one-sdvanv-12lknl.mp4
02. file two-afdsmakl-asdfafdaf.srt
02. file two-afdsmakl-asdfafdaf.mp4
03. file three-adfadaasd-asdfadfafad-adad1d1das.srt
03. file three-adfadaasd-asdfadfafad-adad1d1das.mp4

Agora, como remover a string depois -para que o nome do arquivo fique assim

01. file one.srt
01. file one.mp4
02. file two.srt
02. file two.mp4
03. file three.srt
03. file three.mp4

Responder1

for file in *; do
    ext=.${file##*.}                #Gets file extension
    [ "$ext" = ".$file" ] && ext="" #If file had no extension, set it to empty string
    nostr=${file%%-*}               #Remove everything after -
    mv "$file" "$nostr$ext"
done

Responder2

Você poderia usar a substituição de parâmetros bash assim:

for i in *; do
  # ${i%%-*} get everything before the first '-' (use ${i%-*} for the last '-')
  # ${i/.*} remove everything after the '.'
  # ${i##${i%.*}} remove everything except everything after the last '.'
  mv "${i}" "${i%%-*}${i##${i%.*}}"
done

Responder3

Usando um loop em bash:

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name/-*./.}"
done

Isso renomeia cada .mp4arquivo e .srtarquivo substituindo a parte do nome entre o primeiro traço e o último ponto por um ponto, por meio de uma substituição de variável.

Optei por escolher especificamente os arquivos .mp4e .srt, pois são esses que você mostra na pergunta.

Usando um shloop portátil:

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name%%-*}.${name##*.}"
done

Aqui, ${name%%-*}será o nome original com tudo após o primeiro traço cortado e ${name##*.}será o sufixo do nome do arquivo após o último ponto no nome do arquivo.


Usando o renameutilitário Perl:

$ tree
.
|-- 01. file one-sdvanv-12lknl.mp4
|-- 01. file one-sdvanv-12lknl.srt
|-- 02. file two-afdsmakl-asdfafdaf.mp4
|-- 02. file two-afdsmakl-asdfafdaf.srt
|-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.mp4
`-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.srt

0 directory, 6 files
$ rename 's/-.*\././' -- *.mp4 *.srt
$ tree
.
|-- 01. file one.mp4
|-- 01. file one.srt
|-- 02. file two.mp4
|-- 02. file two.srt
|-- 03. file three.mp4
`-- 03. file three.srt

0 directory, 6 files

A expressão Perl s/-.*\././é uma substituição que será aplicada a cada nome de arquivo fornecido, renomeando o arquivo.

Esta substituição substitui a parte do nome do arquivo do primeiro traço ao último ponto por um ponto.

Você pode querer adicionar algo -nà invocação do renameutilitário para ver primeiro o que aconteceria.

Veja também:

informação relacionada