
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:
- Encuentre todos los archivos pdf de forma recursiva (archivos adjuntos de hashes del Foro de Simple Machines, por eso la extensión es .dat)
- Identificar el tipo de pdf de archivos .dat
- Entonces necesito usar el programa ps2pdf para optimizar todos los archivos pdf nuevos (últimas 24 horas)
- También necesito conservar la marca de tiempo original de los archivos pdf optimizados.
- 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: -f1
imprime 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.dat
del 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 $file
en 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
find
comando 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
cut
dividirá en el lugar equivocado. - Usar
-exec
en lugar dexargs
:find . -name '*.dat' -mtime -1 -exec file -i {} +
- Si
ps2pdf
falla, aún así continuará eliminando el archivo original. Puede utilizar, por ejemplo:ps2pdf ... || continue
para 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.