2013-07-09 5 views
0

У меня есть скрипт для удаления файлов с более низкой версией в каталоге.Удалить дубликаты jars в каталоге

#!/bin/bash 
#Script to remove lower version jar files. 

for PREFIX in `ls *.jar|sed 's/-[0-9\.\0-9\.a-zA-Z]*\.jar//g'|uniq -d`; do 
    for FILE in `ls -r ${PREFIX}*|sed '1d'`; do 
    echo " $FILE" 
    rm $FILE 
    done 
done 

У этого есть ошибка.

У меня есть список дубликатов файлов jar в каталоге.

хуг-1.1.jar хуг-1.1.1.jar аЬс-1.6.jar аЬс-1.3.jar ABC-XYZ-PQR-1.9.6.jar ABC-XYZ-PQR-1.9. 2.jar хуг-tom.jar хуг-том-20120423.jar хуг-том-20120410.jar ABC-инструментарий-1,6-среда-5.2.0.jar ABC-инструментарий-1,6-среда-5.0. 0.jar

Ошибка связана с файлами jar файла xyz. BUG: 1) Сценарий удаляет файл xyz-1.1.1.jar вместо xyz-1.1.jar 2) Сценарий удаляет файлы xyz-tom-20120423.jar и xyz-tom-20120410.jar.

+0

Это своего рода сложная задача для выполнения в сценарии оболочки. Могу ли я предложить переписать на более функциональном языке, чтобы облегчить понимание того, как это происходит? На самом деле, я не вижу причины, поскольку вы, похоже, работаете над проектом Java, а не на Java. – Jules

ответ

1
#!/bin/bash 
if [ $# == 0 ]; then 
     dir='.' 
elif [ $# == 1 ]; then 
     dir=$1 
else 
     echo "Usage: $0 [dir]"; 
     exit 1; 
fi 

for lib in `find $dir -name '*.jar'`; do 
    for class in `unzip -l $lib | egrep -o '[^ ]*.class$'`; do 
    class=`echo $class | sed s/\\\\.class// | sed s/[-.\\/$]/_/g` 
    existing=$(eval "echo \$CLS_${class}") 
    if [ -n "$existing" ]; then echo "$lib $existing"; fi 
    eval CLS_${class}="\"${lib} ${existing}\"" 
    done 
done | sort | uniq -c | sort -nr 

I find this code here

Смежные вопросы