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:
@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 .
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
Selecione os itens e clique com a tecla Control pressionada em um deles.
No menu de atalho, selecione Renomear itens.
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.
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.
Respostas:
Se os seus nomes de arquivo não contêm espaços em branco e você não tem subdiretórios, pode usar um
for
loop simples :Caso contrário, use o
rename
comando 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 comrename
).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:Em sistemas BSD
-printf
, infelizmente não há opção. Mas GNU findutils deve ser instalável (por exemplo, Mac OS X combrew install findutils
).fonte
find
.for f in *; do [[ -f ${f} ]] && mv ...; done
pegar apenas arquivos (sem subdiretórios, links, etc.) ...for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
funciona 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..
antes de todos os meus arquivosTente o
rename
comando na pasta com os arquivos :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 .
fonte
's/^/.../'
significa?'s/^/.../'
é o argumento da expressão perl para o comando renomearrename 's/^start_/run_' *
Acho que isso é exatamente o que você está procurando:
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)
fonte
ls
- isso pode causar problemas se houver espaços ou outros caracteres estranhos nos nomes dos arquivos.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
Selecione os itens e clique com a tecla Control pressionada em um deles.
No menu de atalho, selecione Renomear itens.
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.
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.
fonte
Você pode apenas usar em
-i
vez de-I {}
Isso também funciona perfeitamente.
ls
- lista todos os arquivos no diretórioxargs
- aceita todos os arquivos linha por linha devido à-i
opção{}
é o espaço reservado para todos os arquivos, necessário sexargs
obtiver mais de dois argumentos como entradaUsando o awk:
fonte
-i
está obsoleto, agora é apenas-I
Também funciona para itens com espaços e ignora diretórios
fonte
Com o rnm (você precisará instalá-lo):
Ou
PS: Eu sou o autor desta ferramenta.
fonte
rename
não funciona para mim, masrnm
funciona.Situação:
Temos
certificate.key
certificate.crt
dentro/user/ssl/
Queremos mudar o nome de qualquer coisa que começa com
certificate
acertificate_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
ss
do: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
certi
em qualquer subdiretório começando comss
.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
cd
no diretório e fazê-lo lá. USE POR PRÓPRIO RISCO.fonte
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:
ou para afetar apenas arquivos:
-execdir
primeirocd
s 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
fonte