
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 é:
- Encontre todos os arquivos PDF recursivamente (o Simple Machines Forum hashes anexos, é por isso que a extensão é .dat)
- Identifique o tipo de PDF em arquivos .dat
- Então preciso usar o programa ps2pdf para otimizar todos os novos arquivos PDF (últimas 24h)
- Também preciso manter o carimbo de data/hora original dos arquivos PDF otimizados
- 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: -f1
ele 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.dat
o 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 $file
em caminho ( dirname
) e nome de arquivo ( basename
) e colocar new_
entre eles:
newname="$(dirname "$file")/new_$(basename "$file")"
ps2pdf "$file" "$newname"
Dicas adicionais:
- seu
find
comando 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ê
cut
será dividido no lugar errado. - Use
-exec
em vez dexargs
:find . -name '*.dat' -mtime -1 -exec file -i {} +
- Se
ps2pdf
falhar, você ainda continuará excluindo o arquivo original. Você pode usar, por exemplo:ps2pdf ... || continue
para 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.