Извлеките имена файлов из 7 -zip-архивов один -на -один и используйте имя в качестве параметра для java-программы в терминале

Предположим, что файл XML выглядит примерно так



  
    
      
      
    
  
  
    
      
      
    
  
  
    
      
      
    
  

XMLStarlet сможет разобрать два centerlineузла, у которых нет атрибута id, начинающегося со строкиsid:

$ xmlstarlet sel -t -c '//centerline[starts-with(@id,"sid") = false]' -nl file.xml

    
      
      
    
  
    
      
      
    
  

Запрос XPath //centerline[starts-with(@id,"sid") = false]означает «соответствие каждому centerline, чей атрибут idне начинается со строки sidв любом месте документа». С помощью -cв командной строке xmlstarletмы запрашиваем копию узлов, соответствующих запросу.


Просто чтобы показать, что xmlstarletнемного мощнее, чем простое извлечение элементов между тегами:

Чтобы получить значения xи yузлов pointв этих структурах centerline(с соответствующим префиксомcenterlineid):

$ xmlstarlet sel -t -m '//centerline[starts-with(@id,"sid") = false]/polyline/point' \
                    -v 'concat(../../@id, ":", @x, ",", @y)' -nl file.xml
star12L:487610.06,2803975.46
star12L:501348.98,2795594.35
star12R:487610.06,2803975.46
star12R:501348.98,2795594.35

-mзаставляет xmlstarletсоответствовать только заданным узлам (узлам polyline/pointпод не -исключенными centerlineузлами ), в то время как следующие -vзапрос получает значения, составленные с помощью concat(). concat()объединяет («соединяет» )строки, которые мы хотели бы получить для каждого совпавшего pointузла(../../@idссылается на атрибут idв узле centerline).

2
14.09.2021, 23:26
1 ответ

Возможно, это не самый эффективный способ сделать это, но вот то, что вы спросили.

Во-первых, вам нужен список файлов в архиве. Вы можете получить его с помощью 7za l. Существует недокументированный переключатель -ba, который упрощает обработку вывода . Мы можем взять последний столбец этого вывода, который содержит имена заархивированных файлов, с awk '{print $NF}'. Чтобы получить вывод команды в виде значений в вашем скрипте, мы можем использовать подстановку команды с синтаксисом $().

Вы можете использовать команду eвместо xв вашей команде извлечения файлов 7za, потому что вы берете только файлы и не нуждаетесь в какой-либо структуре каталогов из архива. Не забудьте указать имя архива в качестве аргумента.

Следуя вышеизложенному, сценарий будет примерно таким:

#!/bin/bash

for file in $(7za l -ba compressed.7z | awk '{print $NF}')
do
   7za x -ooutput compressed.7z  "$file"
   java -jar Remove_BoilerPlate_JSON_Updated.jar output/"$file"
done
1
19.09.2021, 17:02

Теги

Похожие вопросы