Renomeie os arquivos na pasta local, adicionando um prefixo ou sufixo

12

Eu tenho muitos arquivos em uma pasta e quero adicionar prefixo ou sufixo (não os dois ) a eles. Eu verifiquei aqui e descobri que posso usar

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

para adicionar um prefixo a todos os arquivos terminados em .jpg(e se eu remover o .jpg, ele adicionará o prefixo a todos os arquivos na pasta atual).

No entanto, eu gostaria de poder

  • Adicione um sufixo (ou seja, renomeie filename.extpara filename.whatever.ext),
  • Verifique se o prefixo ou sufixo já está presente e pule,
  • Crie um alias que aceite argumentos como addprefix whatever *.extouaddsufix whatever *.*
Aquele cara brasileiro
fonte

Respostas:

10

Se você estiver usando bash, então este one-liner pode fazer isso por você (supondo que você tem as variáveis $prefix, $suffixe $extensionprontamente disponíveis)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

Você poderia ter seus scripts assim

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

e

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done
Aaron Okano
fonte
Isso é quase perfeito! Seria perfeito se (1) verificasse se o prefixo ou sufixo já está presente (e depois pulou) e (2) funcionou em arquivos sem extensão. Desculpe por incomodar tanto ...
Aquele cara brasileiro
Para (1) você poderia (acho que não testado) adicionar a verificação de prefixo envolvendo o mv em um if [ $f == $prefix* ]e você pode alterar o sufixo com if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]os comandos mv do casal no opensuffix. Para (2) ele já deve funcionar em arquivos sem extensão, a menos que eu seja um programador horrível.
Aaron Okano 21/09
7

Há um comando Perlrename que deve fazer o truque. Cuidado, porém: existem vários comandos diferentes chamados rename, portanto, certifique-se de ter o script Perl que espera perlexprcomo argumento. Este é o renamecomando fornecido pelo perlpacote no Debian e derivados (Ubuntu, Mint,…), mas não em outras distribuições que possam ter um utilitário diferente chamado rename.

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

Como você pode ver, é idempotente - ele não adicionará o prefixo novamente quando você o chamar várias vezes.

Ele funciona substituindo o início (comprimento zero) das strings ( ^) ou o start seguido por uma prefixstring opcional por prefix.

Vou deixar encapsular isso em um script de shell ou em uma função de shell como um exercício para você :)

O Postfix é um pouco mais difícil, porque você precisa descobrir qual parte do nome do arquivo constitui a extensão ...

Martin von Wittich
fonte
Essa é uma boa resposta, mas eu estava procurando por algo mais universal; Para esta resposta, você precisa renameestar presente tanto o perl quanto esse específico (ou equivalente) . E eu sei que os sufixos são um pouco mais difíceis, não foram abordados na questão vinculada, e eu sou iniciante em linux, bash, shell script, perl e expressões regulares, então "um pouco mais difícil" é bastante difícil para mim ! :)
Aquele cara brasileiro
4

Com zsh:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~é o operador de globbing que significa exceto in zsh.

Stéphane Chazelas
fonte
1

Exemplo simples para alterar o prefixo e a extensão de todas as imagens na pasta atual.

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

Se você quiser verificar como isso afetaria seus dados antes de alterá-los, substitua o mv pelo eco

a saída para IMG_7993.JPG é EG_IMG_7993.jpg

Jinxi
fonte