SCRIPTS para TOUCH

1

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é debo cambiar en ese comando para mantener solo la cadena de "marca de tiempo" para un archivo con la siguiente convención de nomenclatura?

aaaa@XXXXXX(XXXXXXX)_20170201101315.mp3
    
pregunta Gianky Funky 03.02.2017 - 18:32

2 respuestas

0

Tomaría un enfoque un poco diferente, ya que me gustaría probar que el nombre del archivo termina en .mp3 y la longitud de la variable t es de 12 caracteres antes del procesamiento. Esto debería impedirle actuar sobre archivos que no se ajustan al patrón y evitar errores de lanzamiento, aunque los errores en este caso no sean fatales. Simplemente no me gustan los mensajes innecesarios generados.

Este es un ejemplo de ello en forma de script:

#!/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 como 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 se puede reducir 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 realmente quieres acortarlo 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 del comando compuesto no realiza ninguna comprobación de errores y redirige la salida de error del comando touch para que no llene la pantalla. Esta forma está bien en este caso de uso, ya que los comandos táctiles con formato incorrecto no serán fatales.

    
respondido por el user3439894 03.02.2017 - 21:55
1

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

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

Dado que la marca de tiempo en su nombre de archivo incluye los segundos y no está en un formato que toque (acepta 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
    
respondido por el woolfie 03.02.2017 - 21:30

Lea otras preguntas en las etiquetas