1 votos

scripts para TOUCH

He visto un comando útil como este:

for f in *; do t=$(echo $f | sed -E 's/[-. mov]//g'); touch -t $t "$f"; done

¿Qué tengo que cambiar en ese comando para mantener sólo la cadena de "marca de tiempo" para un archivo con la siguiente convención de nomenclatura?

aaaa@XXXXXX(XXXXXXX)_20170201101315.mp3

0 votos

¿Qué tipo de personajes hay realmente en aaaa@XXXXXX(XXXXXXX) , otro entonces @ , ( y ) son a... y X... ¿sólo caracteres alfabéticos o caracteres alfanuméricos? Además, he visto tu pregunta ahora borrada que publicaste erróneamente como respuesta a otra pregunta, touch (Sólo quiero estar seguro de que eso es lo que quieres).

0 votos

Yer señor, soy yo... la muestra del nombre del archivo es - Chiama@800031141(800031141)_20160725093945.mp3 y me gustaría ejecutar un script para poner el valor del sello de datos descrito en el nombre del archivo en el parámetro "TOCAR" para cambiar la fecha de creación y modificación con esos datos. Por supuesto el número de fecha en el nombre del archivo debería ser correcto excepto los segundos que no son necesarios en el parámetro TOUCH.

1voto

woolfie Puntos 41

Puede practicar en la línea de comandos para obtener un sed script que funcione:

$ echo "aaaa@XXXXXX(XXXXXXX)_20170201101315.mp3" | sed -e "s/^.*_//g" -e "s/\.mp3$//g"
20170201101315

Como la marca de tiempo en tu nombre de archivo incluye los segundos y no está en un formato que touch acepte (quiere un '.' antes de los segundos), los excluyo con un corte:

for f in *; do t=$(echo $f |  sed -e "s/^.*_//g" -e "s/\.mp3$//g" | cut -c -12); echo touch -t $t "$f"; touch -t $t "$f"; done

0voto

user3439894 Puntos 5883

Me gustaría tomar un enfoque un poco diferente, en el que me gustaría probar que el nombre del archivo termina en .mp3 y la longitud de la t variable es de 12 caracteres de largo antes de su procesamiento. Esto debe quilla de actuar sobre los archivos que no se ajustan al patrón y evitar tirar errores, aunque los errores en este caso debe ser no-fatal. Simplemente no me gusta innecesarios se obtienen.

Este es un ejemplo de ello en la secuencia de comandos de la forma:

#!/bin/bash

for f in *.mp3; do
    t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"
        if [[ ${#t} -eq 12 ]]; then
            touch -t "$t" "$f"
        fi
done

Este es un ejemplo de la secuencia de comandos de una sola línea, aunque larga.

for f in *.mp3; do t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"; if [[ ${#t} -eq 12 ]]; then touch -t "$t" "$f"; fi; done

Que puede ser reducido a:

for f in *.mp3; do t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"; [[ ${#t} -eq 12 ]] && touch -t "$t" "$f"; done

Si usted realmente desea acortar aún más:

for f in *; do t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"; touch -t "$t" "$f" 2>/dev/null; done

La forma anterior de un compuesto de comando no realiza ninguna comprobación de errores y redirige la salida de error de la touch comando para no saturar la pantalla. Este formulario es correcta en este caso de uso como una malformación de los comandos de toque no va a ser fatal.

0 votos

Funciona perfectamente, he ejecutado el script y en pocos minutos he recuperado la marca de tiempo de más de mil archivos. Muy impresionante, muchas gracias

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X