No mundo real, tenho um xsd em um arquivo jar em várias versões. Estou tentando verificar se o xsd mudou nas versões 10.xyz para 11.abc
Eu tenho diferentes diretórios de lançamento que são lidos apenas como abaixo em alguns /m/n/i/10.xyz ou 11.xyz. Quero procurar por abc.jar que pode ser enterrado em meu diretório de lançamento 10.xyz ou 11.xyz em alguns p/q/r/abc.jar em todos esses lançamentos e extrair xyz.xsd deles e fazer uma comparação entre eles? Também não tenho permissão de gravação nos diretórios de lançamento.
Como posso conseguir isso em Unix ou shell script? Eu sou novo no Unix. Estrutura de diretório
.
|-- 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
Responder1
Supondo que haja apenas um abc.jar
em cada diretório:
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
Responder2
Algo assim, talvez?
#!/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
EDITAR veja o comentário de @ rany-albeg-wein
Responder3
Este script deve fazer o que você precisa. Existem várias suposições que ele está fazendo e não é excessivamente modular. Também não possui cheques. Precisaria de mais detalhes para torná-lo mais robusto.
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
Dados de amostra
$ 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
Responder4
Você pode usar esta função para extrair todos os arquivos de seus jars
find /path/to/dir1 /path/to/dir2 -type f -name 'abc.jar' -exec bash -c 'jar xf "$1" "$2"' _ {} /path/to/file/inside/jar \;
Como você pode ver, jar
pode usar um segundo argumento (e on), após xf
o qual será o nome do arquivo que você deseja extrair do arquivo jar. Este caminho deve ser absoluto dentro da sua estrutura de árvore jar. Se você não souber o caminho para o arquivo dentro do arquivo jar, poderá usar este comando, que extrairá todo o arquivo jar:
find /path/to/dir1 /path/to/dir2 -type f -name 'abc.jar' -exec bash -c 'jar xf "$1"' _ {} \;
Se você usou o primeiro método, você pode simplesmente iterar seus arquivos xsd assim:
for i in *.xsd; do
# diff your files here
done
Se você usou o segundo, terá que usar algo assim:
while IFS= read -rd $'\0' xsd; do
# diff your files here
done < <(find /path/to/relevant/location -type f -name '*.xsd' -print0)