Renomeie todos os arquivos em uma pasta com um prefixo em um único comando


Respostas:


107

Se os seus nomes de arquivo não contêm espaços em branco e você não tem subdiretórios, pode usar um forloop simples :

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

Caso contrário, use o renamecomando conveniente (que é um script perl) - embora possa não estar disponível fora da caixa em todos os Unix (por exemplo, OS X não vem com rename).

Uma breve visão geral em debian-administration.org:

Se os seus nomes de arquivo contiverem espaço em branco, será mais fácil usar find, no Linux, o seguinte deve funcionar:

$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh

Em sistemas BSD -printf, infelizmente não há opção. Mas GNU findutils deve ser instalável (por exemplo, Mac OS X com brew install findutils).

$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh

@Matteo: Obrigado pela dica: atualizei minha resposta com um aviso mais dois exemplos com find.
miku

Também recomendo for f in *; do [[ -f ${f} ]] && mv ...; donepegar apenas arquivos (sem subdiretórios, links, etc.) ...
twalberg

1
Se você citar variáveis ​​como deveria, for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; donefunciona corretamente, independentemente de quais caracteres estão nos nomes de arquivo. Ele também move diretórios, sockets, links simbólicos e outros tipos de arquivo; Eu presumo que isso não importa.
Jonathan Leffler

De alguma forma, isso adicionou um .antes de todos os meus arquivos
nulidade

75

Tente o renamecomando na pasta com os arquivos :

rename 's/^/Unix_/' *

O argumento de renomear ( comando sed s ) indica a substituição do regex ^ por Unix_ . O circunflexo (^) é um caractere especial que significa o início da linha .


8
Você poderia explicar o que 's/^/.../'significa?
mcont

@Matteo 's/^/.../'é o argumento da expressão perl para o comando renomear
RoyalleBlue

isso é incrível! Eu sugeriria adicionar a pasta / *, porque * é um pouco perigoso se o comando for repetido acidentalmente em outro lugar
Systems Rebooter

brew install renomear @OliverPearmain
Felipe Plazas

Exemplo para substituir um prefixo:rename 's/^start_/run_' *
DenisKolodin

35

Acho que isso é exatamente o que você está procurando:

ls | xargs -I {} mv {} Unix_{}

Sim, é simples, mas elegante e poderoso, e também de uma linha. Você pode obter uma introdução mais detalhada minha na página: Renomear arquivos e diretórios (adicionar prefixo)


2
Cuidado ao processar a saída ls- isso pode causar problemas se houver espaços ou outros caracteres estranhos nos nomes dos arquivos.
Jonathan Leffler

15

Recentemente, enfrentei essa mesma situação e encontrei uma solução embutida mais fácil. Estou compartilhando aqui para que possa ajudar outras pessoas na busca de soluções.

Com o OS X Yosemite, a Apple integrou os recursos de renomeação em lote diretamente no Finder. Informações detalhadas estão disponíveis aqui . Eu copiei as etapas abaixo também,

Renomear vários itens

  1. Selecione os itens e clique com a tecla Control pressionada em um deles.

  2. No menu de atalho, selecione Renomear itens.

  3. No menu pop-up abaixo de Renomear itens de pasta, escolha substituir o texto nos nomes, adicionar texto aos nomes ou alterar o formato do nome.

    • Substituir texto: insira o texto que deseja remover no campo Localizar e, em seguida, insira o texto que deseja adicionar no campo “Substituir por”.

    • Adicionar texto: digite o texto que deseja adicionar no campo e, em seguida, escolha adicionar o texto antes ou depois do nome atual.

    • Formato: escolha um formato de nome para os arquivos e, em seguida, coloque o índice, contador ou data antes ou depois do nome. Digite um nome no campo Formato personalizado e, a seguir, digite o número com o qual deseja começar.

  4. Clique em Renomear.

Se você tiver um padrão comum em seus arquivos, poderá usar Substituir texto, caso contrário, Adicionar texto também fará o trabalho.


Excelente - me economizou muito tempo!
user3000868

6

Você pode apenas usar em -ivez de-I {}

ls | xargs -i mv {} unix_{}

Isso também funciona perfeitamente.

  • ls - lista todos os arquivos no diretório
  • xargs- aceita todos os arquivos linha por linha devido à -iopção
  • {}é o espaço reservado para todos os arquivos, necessário se xargsobtiver mais de dois argumentos como entrada

Usando o awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-iestá obsoleto, agora é apenas-I
JamPow

ele me ajudou no Debian 8.Thaks
Abror Esonaliyev

2

Também funciona para itens com espaços e ignora diretórios

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done

1

Com o rnm (você precisará instalá-lo):

rnm -ns 'Unix_/fn/' *

Ou

rnm -rs '/^/Unix_/' *

PS: Eu sou o autor desta ferramenta.


2
Você deve examinar todas as suas respostas sobre o seu utilitário e adicionar a isenção de responsabilidade de que você é o autor.
Mogsdad

@Mogsdad: Não acho que seja uma informação necessária. Se alguém quiser encontrar o autor, é muito fácil.
Jahid

Obrigado por esta ferramenta. Por algum motivo, renamenão funciona para mim, mas rnmfunciona.
Aloso

0

Situação:

Temos certificate.key certificate.crtdentro/user/ssl/

Queremos mudar o nome de qualquer coisa que começa com certificateacertificate_OLD

Agora estamos localizados dentro /user

Primeiro, você faz um ensaio com -n:

rename -n "s/certificate/certificate_old/" ./ssl/*

Que retorna:

rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt) rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)

Seus arquivos permanecerão inalterados, esta é apenas uma execução de teste.

Solução:

Quando estiver satisfeito com o resultado do teste, execute-o de verdade:

rename "s/certificate/certificate_OLD/" ./ssl/*

O que significa:

`renomear" s / SOMETHING / SOMETING_ELSE "PATH / FILES

Dica:

Se você já estiver no caminho, execute-o assim:

rename "s/certificate/certificate_OLD/" *

Ou se você quiser fazer isso em qualquer subdiretório começando com ssdo:

rename -n "s/certificat/certificate_old/" ./ss*/*

Você também pode fazer:

rename -n "s/certi*/certificate_old/" ./ss*/*

Que renomeia qualquer coisa começando com certiem qualquer subdiretório começando com ss.

O céu é o limite.

Brinque com regex e SEMPRE teste ANTES com -n.

CUIDADO COM ISSO AINDA RENOMEARÁ NOMES DE PASTA COM CORRESPONDÊNCIA. Melhor cdno diretório e fazê-lo lá. USE POR PRÓPRIO RISCO.


0

find -execdir rename

Isso renomeia arquivos e diretórios com uma expressão regular afetando apenas nomes de base.

Portanto, para um prefixo, você pode fazer:

PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;

ou para afetar apenas arquivos:

PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;

-execdirprimeiro cds no diretório antes de executar apenas no nome de base.

Eu expliquei com mais detalhes em: Encontre vários arquivos e renomeie-os no Linux

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.