Como você renomeia arquivos ignorando a extensão do arquivo no terminal?

2

Eu tenho várias pastas de arquivos de vídeo que precisam ser renomeadas para algo uniforme, por exemplo: foldername.videotypexvideonumber.avi . Eu olhei para criar um script de shell para tornar isso mais fácil. O comando mv parece ser a melhor maneira de fazer isso.

No entanto, cada guia / tutorial / manpage que eu vi diz que quando eu renomeio um arquivo eu também tenho que incluir a extensão do arquivo. Isso normalmente seria bom, mas algumas pastas têm vídeos de vários tipos de arquivo, por exemplo, .mkv e .avi e até mesmo alguns arquivos .rmvb.

Então, o que eu preciso saber é se existe uma maneira de renomear arquivos através do terminal sem ter que especificar o tipo de arquivo ao fazer isso - basicamente para que a extensão permaneça a mesma, independentemente de o que é antes de renomear.

    
por Saladin Akara 22.01.2011 / 15:45

3 respostas

1

Resposta rápida:

Você não pode fazer isso, já que as extensões fazem parte do nome do arquivo.

Resposta longa:

Você pode usar uma interface gráfica para fazer renomeações avançadas como purrr ou gprename

MAS!

No script de renomeação em lote, você pode usar as seguintes técnicas de divisão de nome de arquivo:

FULLFILENAME="/home/user/video/myvideo-release.xvid.128kbps.avi"
DIRNAME=$(dirname ${FULLFILENAME})   #-- /home/user/video
BASENAME=$(basename ${FULLFILENAME}) #-- myvideo-release.xvid.128kbps.avi
FILENAME=${BASENAME%.*}              #-- myvideo-release.xvid.128kbps
EXTENSION=${BASENAME##*.}            #-- avi
    
por Igor Morgado 22.01.2011 / 16:31
1

Ajudaria a saber exatamente o que você quer fazer, mas você certamente pode fazer isso. Aprender sobre expansão do parâmetro BASH provavelmente é bastante necessário.

Dependendo do que você fizer, talvez seja necessário separar a extensão e o nome do arquivo, ou talvez não.

Suponho que você já tenha cd ed na pasta com os arquivos em questão.

case 1: suponha que você queira alterar a string "bad" para "good" em cada nome de arquivo; então você pode usar uma substituição simples, ou seja, você pode fazer algo como:

for file in * ; do mv "$file" "${file//bad/good}" ; done

(Certifique-se de que não há mudança, pois a mudança de ruim para boa substituirá algo que já existe.) Isso funcionará independentemente da extensão.

case 2: Suponha que você precisa adicionar "novo" antes da extensão, o que quer que seja, então você pode fazer:

for file in * ; do filename="${file%.*}" ; extension="${file##*.}" ; mv "$file" "${filename}new.${extension}" ; done

A extensão permanecerá a mesma, seja ela qual for.

Eu daria mais conselhos, mas, novamente, eu realmente não sei o que você está tentando fazer, exatamente.

    
por frabjous 22.01.2011 / 16:34
0
[temp] λ = ls
test.doc  test.rtf  test.txt
[temp] λ = for f in *; do mv "$f" test2'echo "$f" | sed 's/[^.]*//''; done
[temp] λ = ls
test2.doc  test2.rtf  test2.txt

Pode haver uma maneira mais elegante de fazer isso, mas funciona

Substitua test2 por qualquer coisa que você queira um contador ou algo assim.

    
por nvm 22.01.2011 / 16:39