Извлечь zip-файлы в каталог на основе шаблона имени zip-файла

Извлечь zip-файлы в каталог на основе шаблона имени zip-файла

У меня есть следующие 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

И мне нужно, чтобы каждый zip-архив был извлечен в соответствующий каталог в следующем формате (по сути, мне нужны только первые 30 символов):

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

Это команда, которая у меня есть в данный момент и которая работает, но только для второго 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

Я хотел бы изменить его так, чтобы он считывал только первые 30 символов zip-файла, а затем создавал каталог на их основе. Это гарантирует, что любой новый формат именования zip-файлов будет работать в будущем.

Я попробовал изменить переменную n в команде на эту

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

но это не сработало. Я использую Linux bash.

решение1

С помощью sedвы можете получить первые 30 символов:

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

и используйте это вместо cutв вашем forцикле.

Суть этой sedзамены заключается в том, что то, что сопоставляется между \( \)вами, заменяется на \1. {30}(экранированное с помощью \) насчитывает 30 отдельных символов ( .).

решение2

Спасибо за все предложения, я взял части из предложений каждого и построил эту команду. В моем случае это именно та команда, которая мне нужна.

for f in /mydirectory/*.zip; do
   n=$(echo ${f##*/} | cut -c1-30);
   unzip -d /mydirectory/$n $f;
done
  • Он проходит по всем zip-файлам
  • Выводит каждый zip-файл (только имя файла, дополнительная информация, такая как размер или путь, не отображается), а затем показывает только первые 30 символов и сохраняет их в переменной n
  • Затем он извлекает содержимое в новый каталог (используя переменную n) для каждого zip-файла.

В моем случае я поместил это в скрипт, который запускается из другого каталога.

Связанный контент