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 sed
puedes obtener los primeros 30 caracteres:
sed 's|\(.\{30\}\).*|\1|'
y úsalo en lugar de cut
en tu for
bucle.
El desglose de esa sed
sustitució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.