Como criar um script para renomear arquivos em lote com a data original do arquivo? [RESOLVIDO]

1. Como criar um script para renomear arquivos em lote com a data original do arquivo? [RESOLVIDO]

Luiz Carlos
luizcarlos18rj

(usa Suse)

Enviado em 18/04/2017 - 15:51h

Fala galera...

Peço a ajuda da galera para criar um script do zero que converta milhares de arquivos com vários nomes para um padrão, mas após a conversão eu queria ordenar pelo nome ( em formato de data ) e queria uma sequência correta, mas não sei por onde começar, são arquivos pdf e html e queria deixar os html também em pdf e fiz um tipo de "algoritmo" e queria transformar em shell script.

1 ) Pegue a data original de um arquivo. Ex. 31 MAR 2009

2) Acrescente + 1 dia a essa data verificando mudança de mês .Ex. 31 MAR 2009 --> 01 ABR 2009

3) Transforma essa data no formato "ddmmaa".EX 01 ABR 2009 --> 010409

4) Renomeie o arquivo no formato PD"data". Ex. PD010409

5) Se o arquivo não for pdf, mas sim html, deve convertê-lo para pdf

***Obs: esse passo pode ser dispensável pq eu posso converter na mão através de um software com GUI que faça conversão em lotes, mas mesmo assim se eu "converter" sua data de "criação" / "modificação" será modificada pela data atual, e eu queria que se isso acontecesse eu desse com comando "touch" para que a data original do arquivo fosse a mesma do nome.

6) Os arquivos devem ter sua data de criação modificada de acordo com o nome e não a data atual ( "touch")

7) Os passos de 1 a 6 devem ser feito em lote num pasta com mais de 2.000 arquivos.

8) Ordenar os arquivos em ordem cronológica pela data.

Isso é possível?


  


2. Re: Como criar um script para renomear arquivos em lote com a data original do arquivo? [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 18/04/2017 - 16:44h

luizcarlos18rj escreveu:

Fala galera...

Peço a ajuda da galera para criar um script do zero que converta milhares de arquivos com vários nomes para um padrão, mas após a conversão eu queria ordenar pelo nome ( em formato de data ) e queria uma sequência correta, mas não sei por onde começar, são arquivos pdf e html e queria deixar os html também em pdf e fiz um tipo de "algoritmo" e queria transformar em shell script.

1 ) Pegue a data original de um arquivo. Ex. 31 MAR 2009

2) Acrescente + 1 dia a essa data verificando mudança de mês .Ex. 31 MAR 2009 --> 01 ABR 2009

3) Transforma essa data no formato "ddmmaa".EX 01 ABR 2009 --> 010409

4) Renomeie o arquivo no formato PD"data". Ex. PD010409

5) Se o arquivo não for pdf, mas sim html, deve convertê-lo para pdf

***Obs: esse passo pode ser dispensável pq eu posso converter na mão através de um software com GUI que faça conversão em lotes, mas mesmo assim se eu "converter" sua data de "criação" / "modificação" será modificada pela data atual, e eu queria que se isso acontecesse eu desse com comando "touch" para que a data original do arquivo fosse a mesma do nome.

6) Os arquivos devem ter sua data de criação modificada de acordo com o nome e não a data atual ( "touch")

7) Os passos de 1 a 6 devem ser feito em lote num pasta com mais de 2.000 arquivos.

8) Ordenar os arquivos em ordem cronológica pela data.

Isso é possível?


Boa tarde Luiz.
Algumas sugestões...
"Passos:"
01, 02 e 03
DATA="31-mar-2017"
date -d "$DATA +1 day" +"%d%m%y"
010417

Passo 05:
Coloca em um txt, os arquivos que devem ser convertidos
[[ $(grep -i 'html$' <<< "$ARQUIVO") ]] && echo "$ARQUIVO" >> converter.txt

Esclareça:
O nome atual dos arquivos é "composto por uma data?

marcelo oliver



3. Re: Como criar um script para renomear arquivos em lote com a data original do arquivo?

Perfil removido
removido

(usa Nenhuma)

Enviado em 18/04/2017 - 23:24h

Aqui vai uma tentativa:
#!/bin/bash
i=1
for arquivo in `ls -1 *.{pdf,html}`; do
EXT=$(echo $arquivo | awk -F . '{print $2}')
DATA=$(date -r $arquivo +"%s")
SOMA=$(expr $DATA + 86400)
DATAFINAL=$(date -d @$SOMA +"%d%m%y")
mv -v "$arquivo" "PD-$DATAFINAL-$i.$EXT"
let i=i+1
done





4. Obrigado pela ajuda

Luiz Carlos
luizcarlos18rj

(usa Suse)

Enviado em 29/04/2017 - 21:39h

As dicas de vcs me ajudaram muito, obrigado

desculpa a demora em responder, mas passei dias trabalhando neste código e vou postar em breve.

Sim o nome do arquivo tem a data.

Ex: PD290417.pdf ele foi criado em 28/04/2017, pois é um arquivo que é feito em um dia para upar para o site de intranet para todos verem no dia seguinte suas informações.

Mas ao classificar por nome o linux não reconhece como data assim como a gente, por isso eu organizo por data de criação



5. Ficou pronto

Luiz Carlos
luizcarlos18rj

(usa Suse)

Enviado em 12/05/2017 - 13:20h

Fala galera após muitos dias finalmente consegui deixar o código funcional e a contento...

Agradeço a ajuda de vcs e vou postar o código e se possível me ajudem a "otimizá-lo" ( diminuir o numero de linhas, trocar funções complexas por mais simples de modo a diminuir o código fazendo a mesma coisa.

Qualquer dúvida perguntem...Desde já agradeço.


########## DECLARAÇÃO DE VARIÁVEIS GLOBAIS E CONSTANTES #############

caminho=/opt/lampp/htdocs/Casop/interno/php/Plano-dia/arquivos-processamento/arq_teste
raiz=/opt/lampp/htdocs/Casop/interno/php/Plano-dia/arquivos-processamento

########## DECLARAÇÃO DE FUNÇÕES #############

renomeia(){

#Elimina arquivos desnecesários
#Renomeia nomes com espaço que geram erro em conversão em lote
#Renomeia arquivos para o padrão "PD"DDMMAA.extensão

cd $caminho
find . ! \( -iname "*.pdf" -o -iname "*.html" -o -iname "*.htm" \) -exec rm -f {} \; 2> /dev/null
mkdir $raiz/temp
cd $raiz/temp
mkdir renomear
cd $caminho
find . ! -iname 'PD[0-9][0-9][0-9][0-9][0-9][0-9].*' -exec mv {} $raiz/temp/renomear/ \; 2> /dev/nul
cd $raiz/temp/renomear
ls -w1 > $raiz/temp/nomes_fora_padrao.txt

cat $raiz/temp/nomes_fora_padrao.txt | while read Linha; do
mv "$Linha" "$(echo $Linha | tr '\ ' '_')" 2> /dev/nul
done
ls -w1 > $raiz/temp/nomes_corigidos.txt

cat $raiz/temp/nomes_corigidos.txt | while read Linha; do

dia=$(date -r $Linha +%d)
mes=$(date -r $Linha +%m)
ano=$(date -r $Linha +%y)
datax=$(date --date="$ano-$mes-$dia 1day" +%d%m%y)
extensao=$(echo "$Linha" | cut -d"." -f2)
mv "$Linha" "$(echo "PD"$datax"."$extensao)" 2> /dev/nul
done

find . \( -iname "*.pdf" -o -iname "*.html" -o -iname "*.htm" \) -exec mv {} $caminho/ \; 2> /dev/nul
}

convert_pdf(){

#Chama a subrotina sub_convert_pdf e aplica o "touch" para a data de modificação original dos arquivos.
#Recupera a data de modificação original dos arquivos pdf recém convertidos e junta todos numa só pasta.

touch $raiz/temp/sub_convert_pdf.sh
chmod 775 $raiz/temp/sub_convert_pdf.sh
> $raiz/temp/sub_convert_pdf.sh
cd $caminho/
mkdir $raiz/temp/nopdf
find . -iname '*.htm' -exec mv {} $raiz/temp/nopdf/ \; 2> /dev/nul &&
find . -iname '*.html' -exec mv {} $raiz/temp/nopdf/ \; 2> /dev/nul &&
ls -w1 $raiz/temp/nopdf/ > $raiz/temp/nopdf.txt
cd $raiz/temp/nopdf/
while read Linha; do

arquivo=$(echo "$Linha" | cut -d "." -f1)
ano=$(echo "$Linha" | cut -c 7-8)
mes=$(echo "$Linha" | cut -c 5-6)
dia=$(echo "$Linha" | cut -c 3-4)
horario=$(date -r $Linha +%T)
hora=$(echo $horario | cut -c 1-2)
min=$(echo $horario | cut -c 4-5)
seg=$(echo $horario | cut -c 7-8)
datax=$(date --date="$ano-$mes-$dia -1day" +%Y%m%d)
echo "/opt/wkhtmltox/bin/wkhtmltopdf -q $raiz/temp/nopdf/$Linha $raiz/temp/nopdf/$(echo $arquivo".pdf") 2> /dev/nul" >> $raiz/temp/sub_convert_pdf.sh
echo "touch -t $datax$(echo $hora$min"."$seg) $raiz/temp/nopdf/$(echo $arquivo".pdf") 2> /dev/nul " >> $raiz/temp/sub_convert_pdf.sh

done < $raiz/temp/nopdf.txt
$raiz/temp/sub_convert_pdf.sh
wait
find . -iname '*.pdf' -exec mv {} $caminho/ \; 2> /dev/null
}

organiza(){

#Cria pastas separadas por ano e mês
cd $raiz/temp
touch mover.sh
chmod 755 mover.sh
ls -w1 $caminho > arquivos.txt
cat arquivos.txt | cut -c 7-8 > anox.txt
cat anox.txt | sort | uniq > diretorios.txt
cd $caminho/
mkdir PD_Anteriores
cd $raiz/temp

# Move os arquivos pelo ano.
while read Linha; do

mkdir $caminho/PD_Anteriores/20$Linha 2> /dev/null
echo "find $caminho/ -iname '*$Linha'.pdf -exec mv {} $caminho/PD_Anteriores/20$Linha/ \; 2> /dev/null" >> $raiz/temp/mover.sh

done < diretorios.txt
./mover.sh
find . -type d -empty -exec rm -rf {} \; 2> /dev/null
}
box(){

#Roda o script em modo gráfico.

for i in $(seq 1 100); do
sleep 7.5
echo $i
done | whiptail --title 'Plano do Dia - Anos Anteriores' --gauge 'Iniciado o processo... ( Aguarde por favor )' 6 60 0
whiptail --title 'Plano do Dia - Anos Anteriores' --msgbox 'Finalizado.' 6 60 0
}
separa_mes(){

# Move os arquivos pelo mês.

while read Linha; do

cd $caminho/PD_Anteriores/20$Linha
ls -w1 > $raiz/temp/arquivos$Linha.txt
mkdir 01_JAN 2> /dev/null
mkdir 02_FEV 2> /dev/null
mkdir 03_MAR 2> /dev/null
mkdir 04_ABR 2> /dev/null
mkdir 05_MAI 2> /dev/null
mkdir 06_JUN 2> /dev/null
mkdir 07_JUL 2> /dev/null
mkdir 08_AGO 2> /dev/null
mkdir 09_SET 2> /dev/null
mkdir 10_OUT 2> /dev/null
mkdir 11_NOV 2> /dev/null
mkdir 12_DEZ 2> /dev/null

while read Linha; do

mes=$(echo "$Linha" | cut -c 5-6)

case $mes in
01)
find . -iname 'PD[0-9][0-9]01*' -exec mv {} 01_JAN/ \; 2> /dev/nul;;
02)
find . -iname 'PD[0-9][0-9]02*' -exec mv {} 02_FEV/ \; 2> /dev/nul;;
03)
find . -iname 'PD[0-9][0-9]03*' -exec mv {} 03_MAR/ \; 2> /dev/nul;;
04)
find . -iname 'PD[0-9][0-9]04*' -exec mv {} 04_ABR/ \; 2> /dev/null;;
05)
find . -iname 'PD[0-9][0-9]05*' -exec mv {} 05_MAI/ \; 2> /dev/null;;
06)
find . -iname 'PD[0-9][0-9]06*' -exec mv {} 06_JUN/ \; 2> /dev/null;;
07)
find . -iname 'PD[0-9][0-9]07*' -exec mv {} 07_JUL/ \; 2> /dev/null;;
08)
find . -iname 'PD[0-9][0-9]08*' -exec mv {} 08_AGO/ \; 2> /dev/null;;
09)
find . -iname 'PD[0-9][0-9]09*' -exec mv {} 09_SET/ \; 2> /dev/null;;
10)
find . -iname 'PD[0-9][0-9]10*' -exec mv {} 10_OUT/ \; 2> /dev/null;;
11)
find . -iname 'PD[0-9][0-9]11*' -exec mv {} 11_NOV/ \; 2> /dev/null;;
12)
find . -iname 'PD[0-9][0-9]12*' -exec mv {} 12_DEZ/ \; 2> /dev/null;;

esac

done < $raiz/temp/arquivos$Linha.txt


done < $raiz/temp/diretorios.txt
}

########## INÍCIO #############

box & renomeia
convert_pdf
organiza
separa_mes
rm -rf $raiz/temp/

#FIM





  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts