извлечь файл из jar-файла и получить разницу

извлечь файл из jar-файла и получить разницу

В реальном мире у меня есть xsd в jar-файле в разных релизах. Я пытаюсь проверить, изменился ли xsd в релизах с 10.xyz по 11.abc.

У меня есть разные каталоги релизов, которые доступны только для чтения, как показано ниже, в некоторых /m/n/i/10.xyz или 11.xyz. Я хочу найти abc.jar, который может быть спрятан в моем каталоге релизов 10.xyz или 11.xyz в некоторых p/q/r/abc.jar во всех этих релизах, извлечь из них xyz.xsd и сделать сравнение между ними. Кроме того, у меня нет прав на запись в каталоги релизов.

Как мне это сделать в Unix или скрипте оболочки? Я новичок в Unix. Структура каталога

.
|-- 10.1.2.2.0
|   `-- GENERIC
|       `-- RELEASE
          --  x/y/z/abc.jar
|-- 10.1.2.3.0
|   `-- GENERIC
|       `-- RELEASE
          -- x/y/z/abc.jar
|-- 10.1.3.1.0
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.3.0
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.3.0-HOTPLUG
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.3.0BPA
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.3.0WEBSPHERE
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.3.1
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR1
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR10
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR2
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR3
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR4
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR5
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR6
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR7
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR8
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.4.0MLR9
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.5.0
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.5.0.QA.06012009
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.5.1
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.5.2
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3.5.3
|   `-- GENERIC
|       `-- RELEASE
|-- 10.1.3QAMLR6
|   `-- GENERIC
|       `-- RELEASE
|-- 11.1.1.1.0
|   `-- GENERIC
|       `-- RELEASE
|-- 11.1.1.1.0.BPA
|   `-- GENERIC
|       `-- RELEASE
|-- 11.1.1.1.0.CEP
|   `-- GENERIC
|       `-- RELEASE
|-- 11.1.1.2.0
|   `-- GENERIC
|       `-- RELEASE
|-- 11.1.1.3.0
|   `-- GENERIC
|       `-- RELEASE
`-- 11.1.1.4.0
    `-- GENERIC
        `-- RELEASE

93 directories, 0 files

решение1

abc.jarПредположим, что в каждом каталоге есть только один файл :

basedir=path_to_your_Release_dirs
mkdir /var/tmp/reldiff
cd /var/tmp/reldiff
for x in Release1 Release2 Release3; do
   mkdir $x
   cd $x
   find $basedir/$x -name abc.jar -print0 | xargs -0 unzip -j xyz.xsd
   cd ..
done
diff3 */xyz.xsd

решение2

Может быть, что-то в этом роде?

#!/bin/sh

number_of_releases = 3    

for i in $(seq 1 $number_of_releases)
do
cd Release$i
jar xf abc.jar xyz.xsd
mv xyz.xsd ../xyz.xsd_$i
cd ..
done

for i in $(seq 1 $(($number_of_releases-1)))
do
diff xyz.xsd_$i xyz.xsd_$(($i+1)) > diff_Release$(($i))_to_Release$(($i + 1))
done

РЕДАКТИРОВАТЬ см. комментарий @rany-albeg-wein

решение3

Этот скрипт должен делать то, что вам нужно. Он делает несколько предположений и не слишком модульный. Также не имеет никаких проверок. Потребуется больше подробностей, чтобы сделать его более надежным.

find . -type f -name 'abc.jar' -exec sh -c '
num=$(echo {} | sed 's#.*Release##' | sed 's#/.*##')
jar xvf {} xyz.xsd
mv xyz.xsd xyz.xsd.${num}
' {} \;

for i in xyz.xsd*; do 
  currnum=$(echo $i | sed 's#xyz.xsd.##')
  let nexnum=currnum+1
  [ ! -f xyz.xsd${nexnum} ] || exit
  echo "diff $i xyz.xsd${nexnum} > diffs_xyz.xsd_${currnum}_${nexnum}.txt"
done

Образец данных

$ tree -A
.
├── myscript.bash
├── Release1
│   ├── abc.jar
│   └── xyz.jar
├── Release2
│   ├── abc.jar
│   └── xyz.jar
├── Release3
│   ├── abc.jar
│   └── xyz.jar
└── Release43
    └── xyz.jar

4 directories, 8 files

решение4

Вы можете использовать эту функцию для извлечения всех файлов из ваших jar-архивов.

find /path/to/dir1 /path/to/dir2 -type f -name 'abc.jar' -exec bash -c 'jar xf "$1" "$2"' _ {} /path/to/file/inside/jar \;

Как вы видите, jarможет принимать второй ( и on ) аргумент, после xfкоторого будет имя файла, который вы хотите извлечь из jar-файла. Этот путь должен быть абсолютным в вашей структуре дерева jar. Если вы не знаете путь к файлу в jar-файле, вы можете использовать эту команду, которая вместо этого извлечет весь jar-файл:

find /path/to/dir1 /path/to/dir2 -type f -name 'abc.jar' -exec bash -c 'jar xf "$1"' _ {} \;

Если вы использовали первый метод, то вы можете просто перебрать ваши xsd-файлы следующим образом:

for i in *.xsd; do
    # diff your files here
done

Если вы использовали второй вариант, вам придется использовать что-то вроде этого:

while IFS= read -rd $'\0' xsd; do
    # diff your files here
done < <(find /path/to/relevant/location -type f -name '*.xsd' -print0)

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