Como renomear com prefixo / sufixo?

Como faço para fazer o mv original.filename new.original.filename sem redigitar o nome do arquivo original?

Eu imagino ser capaz de fazer algo como mv -p=new. original.filename mv -p=new. original.filename ou talvez mv original.filename new.~ ou qualquer outra coisa – mas não consigo ver nada assim depois de olhar para man mv / info mv pages.

Claro, eu poderia escrever um script de shell para fazer isso, mas não existe um comando / sinalizador para ele?

No Bash e no zsh você pode fazer isso com o Brace Expansion . Isso simplesmente expande uma lista de itens entre chaves. Por exemplo:

 # echo {vanilla,chocolate,strawberry}-ice-cream vanilla-ice-cream chocolate-ice-cream strawberry-ice-cream 

Então você pode fazer sua renomeação da seguinte forma:

 mv {,new.}original.filename 

como isso se expande para:

 mv original.filename new.original.filename 

Você poderia usar o comando rename (1):

 rename 's/(.*)$/new.$1/' original.filename 

Edit: Se renomear não está disponível e você tem que renomear mais de um arquivo, shell script pode ser realmente curto e simples para isso. Por exemplo, para renomear todos .jpg para prefix_ .jpg no diretório atual:

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

Você pode obter uma renomeação de vários arquivos compatíveis com o UNIX (usando curingas) criando um loop for:

 for file in *; do mv $file new.${file%%} done 

Já vi pessoas mencionarem um comando rename , mas ele não está disponível rotineiramente em sistemas Unix (em oposição a sistemas Linux, por exemplo, ou Cygwin – em ambos os casos, renomear é um executável em vez de um script). Essa versão de rename tem uma funcionalidade bastante limitada:

 rename from to file ... 

Ele substitui a parte de nomes de arquivos pelo to , e o exemplo dado na página man é:

 rename foo foo0 foo? foo?? 

Isso renomeia foo1 para foo01 e foo10 para foo010, etc.

Eu uso um script Perl chamado rename , que eu originalmente descobri na primeira edição do livro Camel, por volta de 1992, e depois estendi, para renomear arquivos.

 #!/bin/perl -w # # @(#)$Id: rename.pl,v 1.7 2008/02/16 07:53:08 jleffler Exp $ # # Rename files using a Perl substitute or transliterate command use strict; use Getopt::Std; my(%opts); my($usage) = "Usage: $0 [-fnxV] perlexpr [filenames]\n"; my($force) = 0; my($noexc) = 0; my($trace) = 0; die $usage unless getopts('fnxV', \%opts); if ($opts{V}) { printf "%s\n", q'RENAME Version $Revision: 1.7 $ ($Date: 2008/02/16 07:53:08 $)'; exit 0; } $force = 1 if ($opts{f}); $noexc = 1 if ($opts{n}); $trace = 1 if ($opts{x}); my($op) = shift; die $usage unless defined $op; if (!@ARGV) { @ARGV = ; chop(@ARGV); } for (@ARGV) { if (-e $_ || -l $_) { my($was) = $_; eval $op; die $@ if $@; next if ($was eq $_); if ($force == 0 && -f $_) { print STDERR "rename failed: $was - $_ exists\n"; } else { print "+ $was --> $_\n" if $trace; print STDERR "rename failed: $was - $!\n" unless ($noexc || rename($was, $_)); } } else { print STDERR "$_ - $!\n"; } } 

Isso permite que você escreva qualquer comando substituto Perl ou transliterado para mapear nomes de arquivos. No exemplo específico solicitado, você usaria:

 rename 's/^/new./' original.filename 

Se estiver aberto a uma modificação, você poderá usar um sufixo em vez de um prefixo. Em seguida, você pode usar a conclusão de tabulação para obter o nome do arquivo original e adicionar o sufixo.

Caso contrário, não, isso não é algo que é suportado pelo comando mv. Um simples shell script poderia lidar com isso.

No meu caso, eu tenho um grupo de arquivos que precisam ser renomeados antes que eu possa trabalhar com eles. Cada arquivo tem sua própria function no grupo e possui seu próprio padrão.

Como resultado, tenho uma lista de comandos rename assim:

 f=`ls *canctn[0-9]*` ; mv $f CNLC.$f f=`ls *acustb[0-9]*` ; mv $f CATB.$f f=`ls *accusgtb[0-9]*` ; mv $f CATB.$f f=`ls *acus[0-9]*` ; mv $f CAUS.$f 

Tente isso também:

 f=MyFileName; mv $f {pref1,pref2}$f{suf1,suf2} 

Isso produzirá todas as combinações com prefixos e sufixos:

 pref1.MyFileName.suf1 ... pref2.MyFileName.suf2 

Outra maneira de resolver o mesmo problema é criar uma matriz de mapeamento e adicionar o prefixo colorspondent para cada tipo de arquivo, conforme mostrado abaixo:

 #!/bin/bash unset masks typeset -A masks masks[ip[0-9]]=ip masks[iaf_usg[0-9]]=ip_usg masks[ipusg[0-9]]=ip_usg ... for fileMask in ${!masks[*]}; do registryEntry="${masks[$fileMask]}"; fileName=*${fileMask}* [ -e ${fileName} ] && mv ${fileName} ${registryEntry}.${fileName} done 

Bulk renomear arquivos bash script

 #!/bin/bash # USAGE: cd FILESDIRECTORY; RENAMERFILEPATH/MultipleFileRenamer.sh FILENAMEPREFIX INITNUMBER # USAGE EXAMPLE: cd PHOTOS; /home/Desktop/MultipleFileRenamer.sh 2016_ # VERSION: 2016.03.05. # COPYRIGHT: Harkály Gergő | mangoRDI (https://wwww.mangordi.com/) # check isset INITNUMBER argument, if not, set 1 | INITNUMBER is the first number after renaming if [ -z "$2" ] then i=1; else i=$2; fi # counts the files to set leading zeros before number | max 1000 files count=$(ls -l * | wc -l) if [ $count -lt 10 ] then zeros=1; else if [ $count -lt 100 ] then zeros=2; else zeros=3 fi fi # rename script for file in * do mv $file $1_$(printf %0"$zeros"d.%s ${i%.*} ${file##*.}) let i="$i+1" done