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 for
loop simples :
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
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 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 ...; 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 arquivos
Tente o rename
comando 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 -i
vez 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 à -i
opção{}
é o espaço reservado para todos os arquivos, necessário se xargs
obtiver mais de dois argumentos como entradaUsando o awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
está 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.
rename
não funciona para mim, mas rnm
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 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 cd
no 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_/' '{}' \;
-execdir
primeiro cd
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