Intereting Posts
Как добавить путь поиска значков в kde4 / plasma5? Вызов сценария из bash имеет проблему с аргументами Перезагрузитесь, если сетевое подключение не работает! Список mimetypes, который по умолчанию соответствует заданному файлу .desktop grep игнорировать специальные символы в файле статус выхода команды отличается, когда он запускается через strace Удаление дополнительных нерабочих сканеров Как указать список установленных пакетов с исходным URI, дистрибутивом и разделом в Debian? Как настроить сообщение завершения работы с базой данных? Базовая ОС для беспроводной передачи и приема Как я могу установить команду `ll` в Mac OS X? grep для отображения только двух слов, поиск которых разделен запятой? Поймать сигнал уничтожения, когда процесс находится в состоянии S Почему rsync ищет DSA вместо ключа RSA при запуске cron job? Способы сохранения ядра Linux?

Извлечь 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.

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

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

и используйте это вместо того, чтобы cut цикл for .

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

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

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

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