Existem vários arquivos em um diretório que começam com o prefixo fgh
, por exemplo:
fghfilea
fghfileb
fghfilec
Eu quero renomear todos eles para começar com o prefixo jkl
. Existe um único comando para fazer isso em vez de renomear cada arquivo individualmente?
file
unix
rename
batch-rename
jww
fonte
fonte
Respostas:
Existem várias maneiras, mas usar
rename
provavelmente será o mais fácil.Usando uma versão de
rename
:Usando outra versão
rename
(igual à resposta do Judy2K ):Você deve verificar a página de manual da sua plataforma para ver qual das opções acima se aplica.
fonte
rename
, então você está mostrando sintaxe para unixhelp.ed.ac.uk/CGI/man-cgi?rename é o outrorename
parece ser um script ou utilitário específico do Linux. Se você se preocupa com a portabilidade, continue usandosed
e loops ou um script Perl embutido.brew install rename
no OS X :)É assim que
sed
emv
podemos ser usados juntos para renomear:Conforme o comentário abaixo, se os nomes dos arquivos tiverem espaços, as aspas podem precisar envolver a subfunção que retorna o nome para o qual os arquivos são movidos:
fonte
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
touch fghfilea fghfileb fghfilec fghfile\ d
. Sugiro que leve em consideração as observações do @DaveNelson.renomear pode não estar em todos os sistemas. Portanto, se você não o tiver, use o shell neste exemplo no bash shell
fonte
sed
comando não é necessário. Este é mais simples que a resposta de @ nik.sh
ou geralmente em outros shells.Usando mmv :
fonte
;
em conjunto com#1
. exemplo:mmv ";fgh*" "#1jkl#2"
Existem várias maneiras de fazer isso (nem todas funcionarão em todos os sistemas unixy):
ls | cut -c4- | xargs -I§ mv fgh§ jkl§
O § pode ser substituído por qualquer coisa que você achar conveniente. Você poderia fazer isso
find -exec
também, mas que se comporta sutilmente diferente em muitos sistemas, então eu costumo evitar isso.for f in fgh*; do mv "$f" "${f/fgh/jkl}";done
Bruto, mas eficaz, como se costuma dizer
rename 's/^fgh/jkl/' fgh*
Muito bonito, mas renomear não está presente no BSD, que é o sistema unix mais comum.
rename fgh jkl fgh*
ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';
Se você insistir em usar Perl, mas não houver renomeação no seu sistema, poderá usar esse monstro.
Alguns deles são um pouco complicados e a lista está longe de estar completa, mas você encontrará o que deseja aqui para praticamente todos os sistemas unix.
fonte
ls
saída não deve ser analisada e / ou canalizadafonte
Usando
find
,xargs
esed
:É mais complexo que a solução da @ nik, mas permite renomear arquivos recursivamente. Por exemplo, a estrutura,
seria transformado para isso,
A chave para fazê-lo funcionar
xargs
é invocar o shell do xargs .fonte
Para instalar o script de renomeação do Perl :
Existem duas renomeações, conforme mencionado nos comentários na resposta de Stephan202. As distribuições baseadas no Debian têm o nome do Perl . Red Hat / rpm distribuições tem a mudança de nome C .
O OS X não possui um instalado por padrão (pelo menos na versão 10.8), nem o Windows / Cygwin.
fonte
Aqui está uma maneira de fazer isso usando a linha de comando Groovy:
fonte
No Solaris, você pode tentar:
fonte
for file in $(find)
é fundamentalmente falho e não pode ser corrigido com a citação. Sefind
retorno./file name with spaces
você receberá umfor
loop sobre./file
,name
,with
e,spaces
e nenhuma quantidade de citar dentro do loop vai ajudar (ou até mesmo ser necessário).fonte
Esse script funcionou para mim na renomeação recursiva com diretórios / nomes de arquivos possivelmente contendo espaços em branco:
Observe a
sed
expressão que neste exemplo substitui todas as ocorrências de;
com espaço. Obviamente, isso deve ser substituído de acordo com as necessidades específicas.
fonte
Usando ferramentas StringSolver (windows e Linux bash), que são processadas por exemplos:
Primeiro, ele calcula um filtro com base em exemplos , onde a entrada é o nome do arquivo e a saída (ok e notok, seqüências arbitrárias). Se o filtro tivesse a opção --auto ou fosse invocado sozinho após esse comando, ele criaria uma pasta
ok
e uma pastanotok
e enviaria arquivos respectivamente para eles.Em seguida, usando o filtro, o
mv
comando é uma movimentação semi-automática que se torna automática com o modificador --auto. Usando o filtro anterior, graças ao --filter, ele encontra um mapeamento defghfilea
parajklfilea
e depois o aplica em todos os arquivos filtrados.Outras soluções de uma linha
Outras maneiras equivalentes de fazer o mesmo (cada linha é equivalente), para que você possa escolher sua maneira favorita de fazê-lo.
Solução em várias etapas
Para descobrir com cuidado se os comandos estão funcionando bem, você pode digitar o seguinte:
e quando tiver certeza de que o filtro está bom, execute o primeiro movimento:
Se você deseja testar e usar o filtro anterior, digite:
Se a transformação não for o que você queria (por exemplo, mesmo que
mv --explain
você veja que algo está errado), digitemv --clear
para reiniciar os arquivos em movimento ou adicione mais exemplos emmv input1 input2
que input1 e input2 são outros exemplosQuando estiver confiante, basta digitar
e voilà! Toda a renomeação é feita usando o filtro.
AVISO LEGAL: Eu sou co-autor deste trabalho feito para fins acadêmicos. Também pode haver um recurso de produção de festança em breve.
fonte
Foi muito mais fácil (no meu Mac) fazer isso no Ruby. Aqui estão 2 exemplos:
fonte
Usando renamer :
Remova a
--dry-run
bandeira quando estiver satisfeito, a saída parece correta.fonte
Minha versão de renomear arquivos em massa:
fonte
Eu recomendaria usar meu próprio script, que resolve esse problema. Ele também possui opções para alterar a codificação dos nomes dos arquivos e converter diacríticos combinados em caracteres pré-compostos, um problema que sempre tenho ao copiar arquivos do meu Mac.
fonte
stale over time
Isso funcionou para mim usando o regexp:
Eu queria que os arquivos fossem renomeados assim:
use o [az | _] + 0 * ([0-9] +. ) regexp onde ([0-9] +. ) é uma subcadeia de grupo a ser usada no comando rename
Produz:
Outro exemplo:
Produz:
Atenção, tenha cuidado.
fonte
Eu escrevi esse script para procurar todos os arquivos .mkv renomeando recursivamente os arquivos encontrados para .avi. Você pode personalizá-lo para seus neeeds. Adicionei algumas outras coisas, como obter diretório, extensão e nome de arquivo a partir de um caminho, caso você precise se referir a algo no futuro.
fonte
Um script genérico para executar uma
sed
expressão em uma lista de arquivos (combina ased
solução com arename
solução ):Invoque passando uma
sed
expressão para o script e, em seguida, qualquer lista de arquivos, como uma versão derename
:fonte
Você também pode usar o script abaixo. é muito fácil rodar no terminal ...
// Renomeie vários arquivos por vez
Exemplo:-
fonte
Outra possível expansão de parâmetro :
fonte