En el mundo real, tengo un xsd en un archivo jar en varias versiones. Estoy intentando verificar si xsd ha cambiado en las versiones 10.xyz a 11.abc.
Tengo diferentes directorios de lanzamiento que se leen solo como se muestra a continuación en algunos /m/n/i/10.xyz o 11.xyz. Quiero buscar abc.jar que puede estar oculto en mi directorio de lanzamiento 10.xyz o 11.xyz. en algunos p/q/r/abc.jar en todas esas versiones y extraer xyz.xsd de ellas y hacer una diferencia entre ellas. Además, no tengo permiso de escritura en los directorios de versiones.
¿Cómo puedo lograrlo en Unix o script de shell? Soy nuevo en Unix. Estructura de directorios
.
|-- 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
Respuesta1
Suponiendo que solo hay uno abc.jar
en cada directorio:
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
Respuesta2
¿Algo así, tal vez?
#!/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 ver el comentario de @rany-albeg-wein
Respuesta3
Este script debería hacer lo que necesita. Se hacen varias suposiciones y no es demasiado modular. Tampoco tiene cheques. Necesitaría más detalles para hacerlo más sólido.
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
Data de muestra
$ 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
Respuesta4
Puede utilizar esta función para extraer todos los archivos de sus archivos 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 \;
Como puede ver, jar
puede tomar un segundo argumento (y más), después xf
del cual será el nombre del archivo que desea extraer del archivo jar. Esta ruta debe ser absoluta dentro de la estructura de su árbol jar. Si no conoce la ruta al archivo dentro del archivo jar, puede usar este comando, que extraerá todo el archivo jar:
find /path/to/dir1 /path/to/dir2 -type f -name 'abc.jar' -exec bash -c 'jar xf "$1"' _ {} \;
Si utilizó el primer método, puede iterar sobre sus archivos xsd de esta manera:
for i in *.xsd; do
# diff your files here
done
Si usaste el segundo tendrás que usar algo como esto:
while IFS= read -rd $'\0' xsd; do
# diff your files here
done < <(find /path/to/relevant/location -type f -name '*.xsd' -print0)