Precisa de ajuda com o script bash do Linux, encontre arquivos PDF recursivamente e otimize-os, mantenha o carimbo de data/hora original

Precisa de ajuda com o script bash do Linux, encontre arquivos PDF recursivamente e otimize-os, mantenha o carimbo de data/hora original

Já tentei encontrar resposta aqui, mas não encontrei. Lamento meu inglês ruim, porque é um pouco difícil para mim falar inglês. Também não tenho quase nenhuma habilidade de script bash, então meu script pode parecer muito ruim. É apenas feito a partir de exemplos que encontrei na internet, mas agora estou contra a parede com isso, então preciso da ajuda de vocês!

O que eu preciso deste script é:

  1. Encontre todos os arquivos PDF recursivamente (o Simple Machines Forum hashes anexos, é por isso que a extensão é .dat)
  2. Identifique o tipo de PDF em arquivos .dat
  3. Então preciso usar o programa ps2pdf para otimizar todos os novos arquivos PDF (últimas 24h)
  4. Também preciso manter o carimbo de data/hora original dos arquivos PDF otimizados
  5. Esse arquivo "24h-pdf-compress-" date +"%d-%m-%Y"".txt" serve apenas para registrar coisas, para que eu possa verificar mais tarde se está funcionando.

A estrutura do diretório de anexos do fórum Smf é a seguinte:

Na pasta de anexos há uma pasta por ano (2020).
Em cada ano existe uma pasta por mês (04 = abril).
Em cada mês estão todos os arquivos anexos daquele mês.
Cada arquivo (jpg,png,pdf) tem a mesma extensão .dat.

/var/www/foorumi/attachments/2020/04/all-files-from-april.dat

Meu roteiro:

#!/bin/bash

cd /var/www/foorumi/attachments

find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1 > "24h-pdf-compress-"`date +"%d-%m-%Y"`".txt"
find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1 | while read -r file

do
        touch -r "$file" "dummy_file"
        ps2pdf "$file" "new_$file" # PROBLEM
        rm "$file"
        mv "new_$file" "$file" # PROBLEM
        touch -r "dummy_file" "$file"
        rm dummy_file
done

mv "24h-pdf-compress-"`date +"%d-%m-%Y"`".txt" /root/24h_pdf_compress_log
find . -iname '*.dat' -user root -exec chown www-data:www-data {} \;

exit 0

Ok, o problema está seguindo. Quando eu executo, find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1ele imprime arquivos como ./04/somepdfattachment.dat, então, quando o script é executado, ps2pdf "$file" "new_$file"ele tenta criar um novo nome de arquivo como new_./04/somepdfattachment.dat..não parece certo.

O próximo erro ocorre quando o script tenta renomear o arquivo mv "new_$file" "$file", porque agora ele tenta renomear new_./04/somepdfattachment.dato arquivo de volta ao nome original.

Espero que você entenda o que tento lhe dizer. Posso fornecer mais informações, se necessário.

Desde já, obrigado!

ATUALIZAR! Como sugeriu @pLumo, modifiquei o script e parece funcionar agora. Espero ter entendido as sugestões corretamente.

Os anexos do fórum Simple Machines são nomeados da seguinte maneira: 403_57066cef00fb1d57137b5613f076d254e89b88bc.dat
"403" = estão executando o número para anexos, o próximo é 404 e o próximo 405 e assim por diante..
"57066cef00..." = é um hash aleatório
".dat"= todos os anexos extensões (jpg,png,pdf) são renomeadas como .dat após o upload.

Roteiro atualizado:

...
do
        touch -r "$file" "dummy_file"
        newname="$(dirname "$file")/new_$(basename "$file")"
        ps2pdf "$file" "$newname" || continue
        rm "$file"
        mv "$newname" "$file"
        touch -r "dummy_file" "$file"
        rm dummy_file
done
...

Responder1

Você precisa dividir $fileem caminho ( dirname) e nome de arquivo ( basename) e colocar new_entre eles:

newname="$(dirname "$file")/new_$(basename "$file")"
ps2pdf "$file" "$newname"

Dicas adicionais:

  • seu findcomando não é seguro quando você tem novas linhas nos resultados, isso estragará seus resultados. Você pode querer se familiarizar com o delimitador zero para canalizar nomes de arquivos com segurança.
  • Acho que o mesmo se aplica se você tiver dois pontos nos nomes dos arquivos, você cutserá dividido no lugar errado.
  • Use -execem vez de xargs:find . -name '*.dat' -mtime -1 -exec file -i {} +
  • Se ps2pdffalhar, você ainda continuará excluindo o arquivo original. Você pode usar, por exemplo: ps2pdf ... || continuepara pular para a próxima iteração em caso de falha.
  • Por favor, use um título mais descritivo, então seu Q também poderá ajudar outras pessoas.

informação relacionada