Eu quero renomear os arquivos em um diretório para números sequenciais. Com base na data de criação dos arquivos.
Para Exemplo sadf.jpg
de 0001.jpg
, wrjr3.jpg
para 0002.jpg
e assim por diante, o número de zeros à esquerda, dependendo da quantidade total de arquivos (sem necessidade de zeros extras se não for necessário).
bash
rename
batch-rename
Gnutt
fonte
fonte
Respostas:
Tente usar um loop
let
, eprintf
para o preenchimento:o uso do
-i
sinalizador impede a substituição automática dos arquivos existentes.fonte
printf -v new "%04d.jpg" ${a}
para colocar o valor na variável E((a++))
trabalha para incrementar a variável. Além disso, isso não ocorre na ordem da data de criação ou minimiza o preenchimento, o que o OP especificou. No entanto, deve-se notar que o Linux / Unix não armazena uma data de criação.mv -- "$i" "$new"
para manipular corretamente os nomes de arquivos de origem que começam com hífens; como é,mv
tentará analisar nomes de arquivos como coleções de sinalizadores.-i
deve ser incluído na resposta e a nota deve ser reescrita de acordo. isso será mais seguro. :(Beleza em uma linha:
Você pode mudar
.ext
com.png
,.jpg
, etc.fonte
ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; done
para ter zero números acolchoadas-n
convém adicionar ao comando mv para evitar a substituição acidental de arquivos. Descobriu isso da maneira mais difícil!ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done
Resultados: (1) classificados em ordem de modificação, arquivos posteriores com índices posteriores; (2) ignora diretórios - e não recursivo; (3) índices de blocos; (4) mantém a extensão original.Gosto da solução de gauteh por sua simplicidade, mas tem uma desvantagem importante. Ao executar em milhares de arquivos, você pode receber a mensagem "lista de argumentos muito longa" ( mais sobre isso ) e, segundo, o script pode ficar muito lento. No meu caso, rodando em aproximadamente 36.000 arquivos, o script mudou aprox. um item por segundo! Não sei ao certo por que isso acontece, mas a regra que recebi dos colegas era "
find
é seu amigo" .Para contar itens e construir o comando, gawk foi usado. Observe a principal diferença, no entanto. Por padrão,
find
procura por arquivos no diretório atual e seus subdiretórios, portanto, certifique-se de limitar a pesquisa apenas no diretório atual, se necessário (useman find
para ver como).fonte
NR
para um comando mais curto.gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
$(rm -rf /).jpg
.for
loop não está demorando 1 segundo por arquivo, a rigor. Está demorando muito tempo para buscar os 36.000 nomes de arquivos do sistema de arquivos e os percorre razoavelmente rapidamente. Muitos sistemas de arquivos têm problemas com diretórios grandes, independentemente de quais comandos precisos você executa; mas normalmente,find
será mais rápido que um curinga do shell, pois ele deve buscar e classificar a lista de arquivos correspondentes.com o comando "renomear"
ou
fonte
rename
(Linux Mint 13) não tem uma-N
opção.rename
comando, mas nunca soube-N
! Obrigado!rename
. O link postado por @Bostrot é mais uma ferramenta de renomeação e parece que @RomanRhrnNesterov usou essa. ¶ Para todos os usuários derename
Peder Stray e Larry Wall (pacoteperl-rename
no arch linux e pacoterename
no debian / ubuntu): Você pode$N
se definir :perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
usar a solução da Pero no OSX exigiu algumas modificações. Eu usei:
nota: as barras invertidas existem para a continuação da linha
editar 20 de julho de 2015: incorporou o feedback de @ klaustopher para citar o
\"%s\"
argumento domv
comando para apoiar nomes de arquivos com espaços.fonte
$(rm -rf /).jpg
.mv
. Se você tiver um arquivo chamado, isto é,some thing.jpg
seu script falhará. Isto é o que eu usei:find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
-maxdepth 1
para trabalhar apenas em jpgs no diretório atual, pois é melhor prevenir do que remediar.ls -1 *.jpg
vez de encontrar, caso contrário, não será classificado. Ou adicione um|sort|
antes do awkUm forro de bash one muito simples que mantém as extensões originais, adiciona zeros à esquerda e também funciona no OSX:
Versão simplificada do http://ubuntuforums.org/showthread.php?t=1355021
fonte
9.ext
antes11.ext
, mas outras ferramentas (comols
) também não o fazem.Para trabalhar em todas as situações, coloque \ "para arquivos que possuem espaço no nome
fonte
$(rm -rf /)
essas ainda são respeitadas.Se o seu
rename
não suportar-N
, você pode fazer algo assim:Editar Para começar com um número determinado, você pode usar o código (de aparência um pouco feia) abaixo, basta substituir 123 pelo número desejado:
Isso lista os arquivos em ordem no momento da criação (o mais novo primeiro, adicione
-r
ls para classificação inversa) e envia essa lista de arquivos para renomear. Renomear usa código perl no regex para formatar e incrementar o contador.No entanto, se você estiver lidando com imagens JPEG com informações EXIF, recomendo
exiftool
Isso é da documentação do exiftool , em "Renomeando Exemplos"
fonte
rename
?No OSX , instale o script de renomeação do Homebrew:
Então você pode fazer isso de maneira ridiculamente fácil:
Ou, para adicionar um bom prefixo:
fonte
Global symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
Siga o comando renomear todos os arquivos para sequenciar e também extensão em minúscula:
fonte
Eu tive um problema semelhante e escrevi um script de shell por esse motivo. Decidi publicá-lo, independentemente de muitas respostas boas já terem sido postadas porque acho que pode ser útil para alguém. Sinta-se livre para melhorá-lo!
numerar
@Gnutt O comportamento que você deseja pode ser alcançado digitando o seguinte:
Se a opção
-r
for deixada de fora, a fresagem será simulada apenas (deve ser útil para testes).A ação L descreve o comprimento do número de destino (que será preenchido com zeros à esquerda). Também é possível adicionar um prefixo / sufixo com as opções
-p <prefix>
-s <suffix>
.Caso alguém queira que os arquivos sejam classificados numericamente antes de serem numerados, basta remover a
-o modtime
opção.fonte
fonte
Vamos supor que temos esses arquivos em um diretório, listados em ordem de criação, sendo o primeiro o mais antigo:
então
ls -1cr
gera exatamente a lista acima. Você pode então usarrename
:quais saídas
O aviso "uso de valor não inicializado […]" é exibido para arquivos sem extensão; você pode ignorá-lo.
Remova
-n
dorename
comando para realmente aplicar a renomeação.Esta resposta é inspirada na resposta de Lucas de abril de 2014 . Ele ignora o requisito de Gnutt de definir o número de zeros à esquerda, dependendo da quantidade total de arquivos.
fonte
ls -1tU
a hora da criação. Também precisava serrename
instalado, o que eu não tinha.Novamente, usando a solução da Pero com poucas modificações, porque
find
estará percorrendo a árvore de diretórios na ordem em que os itens são armazenados nas entradas do diretório. Isso (principalmente) será consistente de execução para execução, na mesma máquina e será essencialmente "ordem de criação de arquivo / diretório" se não houver exclusões.No entanto, em alguns casos, você precisa obter uma ordem lógica, por exemplo, pelo nome, que é usado neste exemplo.
fonte
blahblah; rm -r * blahblah.jpg
?Classificadas por tempo, limitadas a jpg, zeros à esquerda e um nome de base (no caso de você querer um):
(tudo em uma linha, sem o
\
)fonte
ls
entanto, hesito em votar em qualquer coisa que use em um script.renomear -vn - remove n para o modo fora de teste
{$ i = 1;} - número de início do controle
"% 04d.jpg" - controle a contagem zero 04 e defina a extensão de saída .jpg
fonte
rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
Para mim, essa combinação de respostas funcionou perfeitamente:
ls -v
ajuda a ordenar 1 10 9 corretamente: 1 9 10 ordem, evitando problemas de extensão de nome de arquivo com jpg JPG jpeggawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'
renumera com 4 caracteres e zeros à esquerda. Ao evitar o mv, não tento acidentalmente substituir qualquer coisa que já existe por ter acidentalmente o mesmo número.bash
executaEsteja ciente do que a @xhienne disse: canalizar conteúdo desconhecido para o bash é um risco à segurança. Mas esse não foi o meu caso, pois estava usando minhas fotos digitalizadas.
fonte
Você também pode usar ls
fonte
blahblah; rm -r * blahblah.JPG
?A maioria das outras soluções substituirá os arquivos existentes já nomeados como um número. Isso é particularmente um problema se você estiver executando o script, adicionando mais arquivos e, em seguida, executando o script novamente.
Este script renomeia os arquivos numéricos existentes primeiro:
fonte
Esse oneliner lista todos os arquivos no diretório atual, classifica por carimbo de data e hora da criação na ordem inversa (significa que o arquivo mais antigo está no início) e renomeia automaticamente com zeros à direita, conforme exigido pela quantidade de arquivos. A extensão do arquivo será preservada.
Normalmente, só tenho uma pasta há anos para fotos e filmes em celulares. Aplicando esse comando, minhas fotos e filmes estão prontos para uma apresentação de slides na ordem correta na TV ou no arquivamento.
Esteja ciente de que se você tiver colisões de nomes de arquivos, estará perdendo arquivos. Então, primeiro renomeie para algo estranho
temp001.jpg
e, em seguida, execute o seu nome de arquivo final.fonte
ls
não uma vez, mas duas vezes parece que é melhor evitar isso, mas não a estudei em profundidade.ls
; portanto, é por isso que dois deles são necessários. 3. Esses comandos são one-shots e não pretende ser incluído em scripts, para que haja uma razão pela qual as pessoas preferem one-linersAqui está o que funcionou para mim.
Eu usei o comando rename para que, se algum arquivo contiver espaços em seu nome, o comando mv não fique confuso entre os espaços e o arquivo real.
fonte
Atualmente, existe uma opção depois de selecionar vários arquivos para renomear (eu já vi no gerenciador de arquivos thunar).
Um prompt vem com todos os arquivos nesse diretório específico, basta verificar com a seção categoria
fonte
Este script classificará os arquivos por data de criação no Mac OS bash. Eu o uso para renomear vídeos em massa. Apenas mude a extensão e a primeira parte do nome.
fonte
blahblah; rm -r * blahblah.mp4
?Aqui está outra solução com o comando "renomear":
fonte
rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
A resposta de Pero me trouxe aqui :)
Eu queria renomear arquivos em relação ao tempo, pois os visualizadores de imagens não exibiam imagens na ordem do tempo.
fonte
blahblah; rm -r * blahblah.jpg
? Apenas um exemplo extremo.Se você estiver usando o Anotador de imagens para rotular as imagens.
$ make qt5py3
$ python3 labelImg.py
fonte
Para renumerar 6000, arquivos em uma pasta, você pode usar a opção 'Renomear' do programa ACDsee.
Para definir um prefixo, use este formato:
####"*"
Em seguida, defina o número inicial e pressione Renomear para que o programa renomeie todos os 6000 arquivos com números sequenciais.
fonte