在現實世界中,我在各個版本的 jar 檔案中有一個 xsd 我試圖檢查 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或shell腳本中實現它?我是 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)