Renomeie todos os arquivos dentro de uma pasta com o prefixo "Unix_"
Suponha que uma pasta tenha dois arquivos
a.txt
b.pdf
então ambos devem ser renomeados de um único comando para
Unix_a.txt
Unix_b.pdf
Renomeie todos os arquivos dentro de uma pasta com o prefixo "Unix_"
Suponha que uma pasta tenha dois arquivos
a.txt
b.pdf
então ambos devem ser renomeados de um único comando para
Unix_a.txt
Unix_b.pdf
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 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
find.
for f in *; do [[ -f ${f} ]] && mv ...; donepegar apenas arquivos (sem subdiretórios, links, etc.) ...
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.
.antes de todos os meus arquivos
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 .
's/^/.../'significa?
's/^/.../'é o argumento da expressão perl para o comando renomear
rename 's/^start_/run_' *
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)
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.
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órioxargs- 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 entradaUsando o awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-iestá obsoleto, agora é apenas-I
Também funciona para itens com espaços e ignora diretórios
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
Com o rnm (você precisará instalá-lo):
rnm -ns 'Unix_/fn/' *
Ou
rnm -rs '/^/Unix_/' *
PS: Eu sou o autor desta ferramenta.
renamenão funciona para mim, mas rnmfunciona.
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.
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