У меня есть следующие 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-файла.
В моем случае я поместил это в скрипт, который запускается из другого каталога.