Necesita ayuda con el script bash de Linux, busque archivos pdf de forma recursiva y optimícelos, mantenga la marca de tiempo original

Necesita ayuda con el script bash de Linux, busque archivos pdf de forma recursiva y optimícelos, mantenga la marca de tiempo original

Ya intenté encontrar la respuesta aquí, pero no la encontré. Lamento mi mal inglés, porque me resulta un poco difícil hablar inglés. Tampoco tengo casi ninguna habilidad para escribir scripts en bash, por lo que mi script puede verse muy mal. Está hecho solo a partir de ejemplos que pude encontrar en Internet, pero ahora estoy contra la pared con esto, ¡así que necesito ayuda de ustedes!

Lo que necesito de este script es:

  1. Encuentre todos los archivos pdf de forma recursiva (archivos adjuntos de hashes del Foro de Simple Machines, por eso la extensión es .dat)
  2. Identificar el tipo de pdf de archivos .dat
  3. Entonces necesito usar el programa ps2pdf para optimizar todos los archivos pdf nuevos (últimas 24 horas)
  4. También necesito conservar la marca de tiempo original de los archivos pdf optimizados.
  5. Ese archivo "24h-pdf-compress-" date +"%d-%m-%Y"".txt" es sólo para registrar cosas, así que puedo comprobar más tarde si está funcionando.

La estructura del directorio de archivos adjuntos del foro Smf es la siguiente:

En la carpeta de archivos adjuntos hay una carpeta por año (2020).
Debajo de cada año hay una carpeta para el mes (04 = abril).
Debajo de cada mes se encuentran todos los archivos adjuntos de ese mes.
Todos los archivos (jpg,png,pdf) tienen la misma extensión .dat.

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

Mi guión:

#!/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, el problema sigue. Cuando lo ejecuto, find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1imprime archivos como ./04/somepdfattachment.dat, por lo que cuando se ejecuta el script ps2pdf "$file" "new_$file"intenta crear un nuevo nombre de archivo como new_./04/somepdfattachment.dat... no suena bien.

El siguiente error se produce cuando el script intenta cambiar el nombre del archivo mv "new_$file" "$file", porque ahora intenta cambiar el nombre new_./04/somepdfattachment.datdel archivo a su nombre original.

Espero que entiendas lo que intento decirte. Puedo proporcionar más información si es necesario.

¡Gracias de antemano!

¡ACTUALIZAR! Como sugirió @pLumo, modifiqué el script y parece funcionar ahora. Espero haber entendido las sugerencias correctamente.

Los archivos adjuntos del foro de Simple Machines se denominan de la siguiente manera: 403_57066cef00fb1d57137b5613f076d254e89b88bc.dat
"403" = son números de ejecución para los archivos adjuntos, el siguiente es 404 y el siguiente 405 y así sucesivamente...
"57066cef00..." = es un hash aleatorio
".dat"= todos los archivos adjuntos las extensiones (jpg,png,pdf) pasan a llamarse .dat después de la carga.

Guión actualizado:

...
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
...

Respuesta1

Debes dividirlo $fileen su ruta ( dirname) y nombre de archivo ( basename) y colocarlos new_en el medio:

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

Consejos adicionales:

  • su findcomando no es seguro cuando tiene nuevas líneas en los resultados, arruinará sus resultados. Quizás quieras familiarizarte con el delimitador cero para canalizar nombres de archivos de forma segura.
  • Creo que se aplica lo mismo si tiene dos puntos en los nombres de archivos, se cutdividirá en el lugar equivocado.
  • Usar -execen lugar de xargs:find . -name '*.dat' -mtime -1 -exec file -i {} +
  • Si ps2pdffalla, aún así continuará eliminando el archivo original. Puede utilizar, por ejemplo: ps2pdf ... || continuepara saltar a la siguiente iteración en caso de error.
  • Utilice un título más descriptivo, entonces su Q también podrá ayudar a otras personas.

información relacionada