2009-12-03 4 views
0

У меня есть файл tgz, который содержит файл версии, version.txt. Этот файл имеет только одну строку «version = 1.0.0». Этот файл tgz присутствует в двух разных каталогах и имеет одно и то же имя.awk и bash script

Мое требование состоит в том, что мне нужно использовать скрипт bash и awk, чтобы определить, какой из этих двух файлов tgz имеет последнюю версию. т. е. файл tgz, имеющий 1.0.0, имеет более низкую версию, чем файл с версией 1.0.1.

+4

Вы совершенно уверены, что это _has_, чтобы быть bash и awk. И вы только что зарегистрировались сегодня. Вы пытаетесь заставить кого-то сделать домашнее задание для вас? – edoloughlin

+2

Это требование не вопрос. Вы искали какие-либо руководства по написанию сценариев bash в Интернете и проверили ли вы man-страницу для gzip? –

+0

Это просто, что это мой первый раз с любым скриптовым языком и не просить кого-либо выполнять мою задачу. В настоящее время со ссылкой на Интернет я на этом этапе. tar -xzvf /mnt/cf/bundle.tgz -O version.txt | awk '/ version =/{print}' version.txt – Taroko

ответ

1

Используйте tar -xzvf /mnt/cf/bundle.tgz -O version.txt для извлечения версии.

Сложная часть - как обрабатывать версию. Если ваша версия имеет всегда три цифры, я предлагаю умножить каждую часть на 1000. Это даст вам большое количество, которое вы можете легко сравнить. То есть 1.0.0 == 1000000000; 1.0.1 = 1000000001. Другим вариантом является форматирование каждой части с помощью% 04d: 0001.0000.0000 и 0001.0000.0001. Эти строки можно сравнить.

1

Извинения за нижний и отрицательный комментарии, но я всегда сомневаюсь в вопросах типа домашних заданий. Чтобы внести поправки, я сделал это для вас. Вам не нужно awk, все может быть сделано в bash.

Просто установите F1 и F2 на правильные имена файлов. Я оставлю это как упражнение для вас, чтобы принять их в качестве аргументов командной строки :)

#!/usr/bin/env bash 
F1=f1.tgz 
F2=f2.tgz 
VERSION_FILE=version.txt 
version1=`tar -xzf $F1 -O $VERSION_FILE|sed -e 's/.*version=//'` 
version2=`tar -xzf $F2 -O $VERSION_FILE|sed -e 's/.*version=//'` 

if [ "$version1" == "$version2" ]; then 
    echo "$F1 and $F2 contain the same version: $version1, $version2" 
    exit 0; 
fi 

( # start a subshell because we're changing IFS 

    # Assume F1 is the latest file unless we find otherwise below 
    latest_file=$F1 
    latest_version=$version1 

    # set the Internal Field Separator to a dot so we can 
    # split the version strings into arrays 
    IFS=. 

    # make arrays of the version strings 
    v1parts=($version1) 
    v2parts=($version2) 

    # loop over $v1parts, comparing to $v2parts 
    # NOTE: this assumes the version strings have the same 
    # number of components. If wont work for 1.1 and 1.1.1, 
    # You'd have to have 1.1.0 and 1.1.1 
    # You could always add extra '0' components to the shorter array, but 
    # life's too short... 
    for ((i = 0 ; i < ${#v1parts[@]} ; i++)); do 
     # NOTE: ${#v1parts[@]} is the length of the v1parts array 
     if [ "${v1parts[i]}" -lt "${v2parts[i]}" ]; then 
      latest_file=$F2 
      latest_version=$version2 
      break; 
     fi 
    done 
    echo "$latest_file is newer, version $latest_version" 
)