Estoy tratando de OCR algunos documentos in situ (desde una línea de comandos de Linux en un recurso compartido de Windows). El proceso de OCR es buscar y me he confundido con el comando de búsqueda para canalizar los archivos a través del bucle correctamente.
Sin embargo, necesito preservar la marca de tiempo original para modificar. Actualmente estoy tratando de usar stat y tocar como a continuación:
#!/bin/bash
OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for f in `find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
do
ORIGTS=`stat -c "%Y" $f`
sudo /opt/ABBYYOCR9/abbyyocr9 -rl English -pi -if $f -f PDFA -paemImageOnText -pafpr original -of $f
touch -t $ORIGTS $f
done
IFS=$OLDIFS
Por supuesto, el comando táctil falla. al ejecutar los comandos por separado, noto que "stat -c" es algo similar a esto:
1334758696
lo cual es como ninguna fecha lo sé. Siento que estoy cerca pero no puedo resolver cómo convertir la fecha que tengo en una versión táctil. ¿Es alguna forma de segundos de algo?
IFS
parece inusual. ¿Realmente quería dividirse en la tecla de retroceso (\b
)? Consulte unix.stackexchange.com/questions/9496/… para obtener algunos consejos.Respuestas:
stat's
La salida es una marca de tiempo de Unix, también llamada segundos desde la época .Todos los coreutils de GNU que aceptan una fecha le permiten poner una marca de tiempo en su lugar al prefijar la marca de tiempo con un
@
.Así que prueba esto
Ver coreutils - Segundos desde la época
fuente
touch
puede usar la marca de tiempo de un archivo usando la-r
opción Es posible que desee enviar a un archivo diferente (supongo a continuación que-if
es un archivo de entrada y-of
un archivo de salida)fuente
stat
.Ya que está asumiendo una concha
echo -e
y tiene un golpe en su línea shebang de todos modos, puede usarIFS=$'\n\b'
. Hacer que el retroceso sea un separador es bastante extraño. No necesitasIFS
lo que estás haciendo de todos modos.Tenga en cuenta que esto restaura el valor anterior de
IFS
solo siIFS
se estableció inicialmente. SiIFS
inicialmente no se configuró, esto se estableceIFS
en la cadena vacía, que es completamente diferente. En ksh, bash o zsh, si necesita configurarloIFS
temporalmente, puede escribir su código en una función y convertirlo enIFS
local. En otros proyectiles, debe tener cuidado con el caso sin configurar.Nunca use la sustitución de comandos en la salida de
find
.$IFS
. Si estableceIFS
una nueva línea, esto divide la salida en nuevas líneas, pero aún no puede manejar los nombres de archivo que contienen nuevas líneas.A[12].pdf
,A1.pdf
yA2.pdf
terminará conA1.pdf A2.pdf A1.pdf A2.pdf
. Puede desactivar el globbing conset -f
(y volver a activarlo conset +f
), pero aquí (como la mayoría de las veces) la forma correcta es no usar la sustitución de comandos.Use el
-exec
argumento parafind
(o si su sistema lo tiene-print0
, puede usarlofind … -print0 | xargs -0 …
en su lugar; esto solo es útil para actuar en múltiples archivos a la vez si necesita portabilidad a sistemas Linux antiguos o sistemas OpenBSD actuales que tienen-print0
pero no-exec … {} +
).Tenga en cuenta que le faltan comillas dobles
$f
(no son necesarias si estos son los resultados de la división y no ha cambiadoIFS
desde entonces y el globbing está desactivado, pero realmente, siempre ponga comillas dobles a menos que sepa por qué puede ' no los dejes puestos).Esto es torpe y no portátil (
stat
no existe en todos los sistemas, y sus argumentos son diferentes en los diferentes sistemas donde existe).touch
tiene una opción portátil para configurar un archivo a la marca de tiempo de otro archivo:touch -r REFERENCE_FILE FILE
. En su lugar, recomendaría uno de dos enfoques:touch -r
para establecer la fecha del nuevo archivo y finalmente mueva el nuevo archivo a su lugar. Es mejor asegurarse de que la salida esté bien antes de que algo le pase a la entrada; de lo contrario, si la transformación se interrumpe por algún motivo (por ejemplo, una falla de energía), perderá datos.touch -r
dos veces: una para guardar la fecha del archivo original en un archivo temporal vacío (que se creará automáticamente), luego otra vez después de la transformación para restaurar la fecha usando el archivo temporal.Así:
fuente
Por alguna razón me perdí la respuesta
touch -r
; si, por alguna extraña razón, no tiene GNU coreutils 'stat
como en la respuesta aceptada ni puede usartouch -r
, aquí letouch
mostramos cómo obtener la marca de tiempo en formato amigable con un formato BSDstat
.Pero realmente, solo usa
touch -r
:fuente
Tuve el mismo problema, viniendo del proceso de 'hacer películas'.
En el ejemplo a continuación se
orig_file.wav
muestra el archivo con la marca de tiempo original, mientras queprocessed_file.wav
es el archivo con el mismo contenido, pero con la marca de tiempo incorrecta.ANTES DE:
localhost $ ls -lh orig_file.wav processed_file.wav Jan 23 17:15 processed_file.wav Jul 9 2018 orig_file.wav
EL COMANDO:
localhost $ touch -t $(date --date=@`stat -f%B orig_file.wav` +%Y%m%d%H%M.%S) processed_file.wav
DESPUÉS:
localhost $ ls -lh orig_file.wav processed_file.wav Jul 9 2018 processed_file.wav Jul 9 2018 orig_file.wav
NOTAS
stat
en tics invertidos le da la marca de tiempo de creación del archivo original como tiempo de época de Unix (en segundos). El @ from coreutils lo convierte en una fecha iso quedate
puede entender y formatear con AAAAMMDDHHmm.SS para quetouch
pueda entenderlo. Puse eldate
comando en $ (), como un equivalente de tics invertidos, ya que no se pueden reutilizar en el mismo comando.fuente
touch -r
)? (2)stat
se puede poner$(…)
; se pueden usar varias veces en un solo comando.