jar 파일에서 파일을 추출하고 차이점을 얻으십시오.

jar 파일에서 파일을 추출하고 차이점을 얻으십시오.

실제로는 다양한 릴리스의 jar 파일에 xsd가 있습니다. xsd가 릴리스 10.xyz에서 11.abc로 변경되었는지 확인하려고 합니다.

일부 /m/n/i/10.xyz 또는 11.xyz에서 아래와 같이 읽기만 가능한 다른 릴리스 디렉토리가 있습니다. 내 릴리스 디렉토리 10.xyz 또는 11.xyz에 묻혀 있을 수 있는 abc.jar을 검색하고 싶습니다. 모든 릴리스의 일부 p/q/r/abc.jar에서 xyz.xsd를 추출하고 그들 사이에 차이점을 확인합니까? 또한 릴리스 디렉토리에 대한 쓰기 권한이 없습니다.

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 파일에서 추출하려는 파일 이름이 될 jar두 번째 (및 on) 인수를 취할 수 있습니다 . xf이 경로는 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)

관련 정보