Renomear nome de ficheiros para numeros

1. Renomear nome de ficheiros para numeros

Ede
ede_linux

(usa Ubuntu)

Enviado em 24/10/2018 - 10:19h

Olá todos,

Possuo um directorio, com vários pdf e pastas com mais pdf, onde pretendo renomear todos esses pdf's. Tudo está "pendurado" em um só directório. O objectivo é renomear o nome do arquivo para um número. No final terei, por exemplo, 300 arquivos pdf cujo os nomes serão:

1.pdf
2.pdf
...
500.pdf
501.pdf


Para isso construí este script:

#!/bin/bash

find -iname "*.pdf" | while read line
do
((count++))
# altera nome de cada ficheiro pdf que encontra
mv $line $count".pdf"
done


Acontece que uma vez renomeados os ficheiros não consigo renomear mais vezes os mesmos ficheiros. Pois vai sempre existir uma numeração que coincide. Significa que ele vai renomear o ficheiro 22.pdf para o ficheiro 22.pdf. O que resulta em ficheiros perdidos.

Tenho estado a pensar no seguinte. O script procura apenas ficheiros pdf. É um dos requisitos, pois apenas pretendo que o nome dos ficheiros pdf seja alterados. Agora falta fazer com que apenas o script altere ficheiros cujo o nome ainda não foi alterado. Pois uma vez atribuido o nome 55.pdf este não pode ser alterado mais nenhuma vez! (o número vai funcionar como um index para identificar os pdf's). Pensei em detectar se o nome do ficheiro era apenas composto por números. Pois inicialmente o ficheiro tem um nome normal. Após edição é que pretendo que fique algo do genero "8.pdf". Sei que existe maneira de fazer isso em expressões regulares, algo como \d.

O que falta no script que estou a construir, penso que seja a validação se o ficheiro tem o nome composto por numeros ou não. Algo do genero:

1-Detecta todos os ficheiros pdf no directorio;
2-Detecta se o nome se encontra entre 1 até infinito (primeiro porque não sei quantos pdf já foram renomeados, segundo porque preciso de detectar se o ficheiro já foi renomeado em vezes anteriores;
3-Se o nome do ficheiro já é algo como "45.pdf" então não faz nada. Caso seja um nome, incluindo espaços, então pesquisa qual é o último numero para nome de pdf que existe e atribui o seguinte;


Este passo 3 no algoritmo é importante. Pois vamos imaginar que tenho 500 pdf no directorio. Todos tem o nome algo do genero (1.pdf, 2.pdf ... 52.pdf ....) O novo pdf que cai no directorio terá que receber o numero 501.pdf

Para não alongar mais o post, vou aguardas as vossas sugestões. Pois ideias não faltam :) Por exemplo, posso passar todos os nomes do ficheiros pdf para um array. Ordernar o array. Nas últimas posições vão ficar os nomes que não números. Varrer essas posições e alterar para numeros. A numeração começava num numero após a última posição existente no array.

Lá está, ideias não faltam. Falta é conseguir passar isso tudo para shellscript e talvez utilizar expressões regulares :)
Obrigado


  


2. Re: Renomear nome de ficheiros para numeros

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 24/10/2018 - 22:22h

ede_linux escreveu:

Olá todos,

Possuo um directorio, com vários pdf e pastas com mais pdf, onde pretendo renomear todos esses pdf's.
Tudo está "pendurado" em um só directório.
O objectivo é renomear o nome do arquivo para um número.
No final terei, por exemplo, 300 arquivos pdf cujo os nomes serão:

1.pdf
2.pdf
...
500.pdf
501.pdf


Para isso construí este script:

#!/bin/bash

find -iname "*.pdf" | while read line
do
((count++))
# altera nome de cada ficheiro pdf que encontra
mv $line $count".pdf"
done


Acontece que uma vez renomeados os ficheiros não consigo renomear mais vezes os mesmos ficheiros.
Pois vai sempre existir uma numeração que coincide. Significa que ele vai renomear o ficheiro 22.pdf para o ficheiro 22.pdf. O que resulta em ficheiros perdidos.

Tenho estado a pensar no seguinte. O script procura apenas ficheiros pdf. É um dos requisitos, pois apenas pretendo que o nome dos ficheiros pdf seja alterados. Agora falta fazer com que apenas o script altere ficheiros cujo o nome ainda não foi alterado. Pois uma vez atribuido o nome 55.pdf este não pode ser alterado mais nenhuma vez! (o número vai funcionar como um index para identificar os pdf's). Pensei em detectar se o nome do ficheiro era apenas composto por números. Pois inicialmente o ficheiro tem um nome normal. Após edição é que pretendo que fique algo do genero "8.pdf". Sei que existe maneira de fazer isso em expressões regulares, algo como \d.

O que falta no script que estou a construir, penso que seja a validação se o ficheiro tem o nome composto por numeros ou não. Algo do genero:

1-Detecta todos os ficheiros pdf no directorio;
2-Detecta se o nome se encontra entre 1 até infinito (primeiro porque não sei quantos pdf já foram renomeados, segundo porque preciso de detectar se o ficheiro já foi renomeado em vezes anteriores;
3-Se o nome do ficheiro já é algo como "45.pdf" então não faz nada. Caso seja um nome, incluindo espaços, então pesquisa qual é o último numero para nome de pdf que existe e atribui o seguinte;


Este passo 3 no algoritmo é importante. Pois vamos imaginar que tenho 500 pdf no directorio. Todos tem o nome algo do genero (1.pdf, 2.pdf ... 52.pdf ....) O novo pdf que cai no directorio terá que receber o numero 501.pdf

Para não alongar mais o post, vou aguardas as vossas sugestões. Pois ideias não faltam :) Por exemplo, posso passar todos os nomes do ficheiros pdf para um array. Ordernar o array. Nas últimas posições vão ficar os nomes que não números. Varrer essas posições e alterar para numeros. A numeração começava num numero após a última posição existente no array.

Lá está, ideias não faltam. Falta é conseguir passar isso tudo para shellscript e talvez utilizar expressões regulares :)
Obrigado


Boa noite Ede.
Segue sugestão:
#!/bin/bash
#DEFINA O DIRETÓRIO DE ORIGEM NA LINHA ABAIXO.
DIR_ORIGEM="/home/user/"
#DEFINA a extensão
EXT="pdf"
#PEGA TODOS ARQUIVOS PDF A PARTIR DE DIR_ORIGEM, RECURSIVAMENTE, E OS COLOCA NO DESCRITOR de ARQUIVOS nº3 (FD3).
exec 3< <(find ${DIR_ORIGEM} -type f -iname "*.${EXT}");
count=0;
while read arq <&3;do
let count++
COUNT=$(printf "%03d" $count)
DIR=$(dirname "${arq}")
echo -e "MENSAGEM de TESTES => Num: ${COUNT}\t Arq: ${arq} \t Dir: ${DIR}/ Nome: ${COUNT}.${EXT}"
mv ${arq// /\\ } ${DIR}/${COUNT}.${EXT}
done;
exec 3<&-


Att.:
Marcelo Oliver


3. Re: Renomear nome de ficheiros para numeros

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 25/10/2018 - 00:19h

Alternativa:
#!/bin/bash
# Renomear arquivos para nomes apenas numéricos.

dir="/tmp/testes"

#Procura *.pdf com nomes apenas numéricos e guarda o maior número:
vmaior=`find $dir -type f -regex ".*/[0-9]+.pdf" | grep -Eo '[0-9]+' | sort -n | tail -n 1`

#Procura *.pdf com nomes contendo letras e números e renomeia com apenas números:
for file in $(find $dir -type f -iname '*.pdf' | grep -Ev '*/[0-9]+')
do
let vmaior++
echo "Renomear: "${file}" --> "$(dirname ${file})"/"${vmaior}".pdf"
#mv -v -i -- "${file}" "$(dirname ${file})"/"${vmaior}".pdf
done








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts