Extraiga archivos zip en el directorio según el patrón del nombre zip

Extraiga archivos zip en el directorio según el patrón del nombre zip

Tengo estos archivos zip:

PLP_633555_2015-03-04_01-12-01.zip
PLP_634562_2004-03-02_02-15-07_UBIC.zip
PLP_563462_2008-05-02_01-21-03_UBIC_STOC.zip

Y necesito que cada zip se extraiga en su directorio apropiado con este formato (básicamente, solo necesito los primeros 30 caracteres):

PLP_633555_2015-03-04_01-12-01
PLP_634562_2004-03-02_02-15-07
PLP_563462_2008-05-02_01-21-03

Este es el comando que tengo actualmente, que funciona pero sólo para el segundo archivo zip (PLP_634562_2004-03-02_02-15-07_UBIC.zip)

for f in /PLP*.zip; do n=$(echo $f | cut -f 1-5 -d '_'); unzip -d $n $f;done

Me gustaría cambiarlo para que lea solo los primeros 30 caracteres del archivo zip y luego cree el directorio basado en eso. Garantizará que cualquier nuevo formato de nombre de archivo zip funcione en el futuro.

Intenté cambiar la parte n variable del comando a esto

n=$(echo ${f:0:30}); 

pero eso no funcionó. Estoy usando Linux bash.

Respuesta1

Con sedpuedes obtener los primeros 30 caracteres:

sed 's|\(.\{30\}\).*|\1|'

y úsalo en lugar de cuten tu forbucle.

El desglose de esa sedsustitución es que lo que coincide \( \)se sustituye por \1. {30}(escapado con ) cuenta \30 caracteres individuales ( .).

Respuesta2

Gracias por todas las sugerencias, tomé partes de las sugerencias de todos y construí este comando. En mi caso este es exactamente el comando que necesitaba.

for f in /mydirectory/*.zip; do
   n=$(echo ${f##*/} | cut -c1-30);
   unzip -d /mydirectory/$n $f;
done
  • Recorre todos los archivos zip.
  • Hace eco de cada archivo zip (solo el nombre del archivo, no se muestra información adicional como el tamaño o la ruta) y luego solo muestra los primeros 30 caracteres y los almacena en n variables
  • Luego extrae el contenido en un nuevo directorio (usando n variables) para cada archivo zip.

En mi caso, puse esto en un script que se ejecuta desde otro directorio.

información relacionada