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.