首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查看.tar文件是否有更改,如果有更改,则解压缩、构建并运行

查看.tar文件是否有更改,如果有更改,则解压缩、构建并运行
EN

Stack Overflow用户
提问于 2012-02-11 03:31:52
回答 3查看 329关注 0票数 0

我正在尝试查看tar文件是否有更改,如果更改了,则将这些文件解压缩,将cd放入目录中,然后构建,然后运行。

我手头上的资料如下:

代码语言:javascript
复制
while [ 1 ]
do
    checksum=`md5sum kinect.tar`
    sleep 10
    newsum=`md5sum kinect.tar`
    if [ $newsum -ne $checksum ]
    then
        killall lebron
        tar -zxf kinect.tar
        cd kinect
        make
        ./lebron &
    fi
done

偶尔,我在使用if时会遇到[ has too many arguments错误,但我不确定原因。我所拥有的一切都可以吗?你能建议一个替代的解决方案吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-11 12:16:34

您的问题之一是md5sum同时返回散列和文件名。您只想捕获散列。您可以使用带有重定向和进程替换的read内置来轻松完成此操作。

而且,既然你已经使用bash作为你的解释器,那么你真的没有必要在[ ]上使用[[ ]],而且前者的能力要强得多。

代码语言:javascript
复制
#!/bin/bash

while true; do
    read checksum _ < <(md5sum kinect.tar)
    sleep 10
    read newsum _ < <(md5sum kinect.tar)
    if [[ $newsum != $checksum ]]; then
        killall lebron
        tar -zxf kinect.tar
        cd kinect
        make
        ./lebron &
    fi
done
票数 1
EN

Stack Overflow用户

发布于 2012-02-11 03:37:54

首先,你没有引用你的变量。其次,-ne用于比较数字,而不是字符串。请改用!=

代码语言:javascript
复制
if [ "$newsum" != "$checksum" ]

正如Ed Heal在他的评论中指出的那样,只有当文件被原子修改时,算法才可能有意义。保证这一点的最好方法是在一个地方生成它,然后将其转移到kinect.tar。此外,如果在构建以前的版本时修改了文件,您的代码将无法捕获更改,这可以通过Ed Heal建议的以下更改进行修复:

代码语言:javascript
复制
checksum=`md5sum kinect.tar`
while [ 1 ]
do
    sleep 10
    old_checksum=$checksum
    checksum=`md5sum kinect.tar`
    if [ "$old_checksum" != "$checksum" ]

实际上,如果您有一种更好的方法让编写.tar文件的进程与您的脚本通信,那将是最好的。例如,新的.tar文件总是完全写入,然后移动到kinect-new.tar,脚本检查并移动到kinect.tar。这样既避免了读取不完整文件的可能性,也避免了比较md5sums时的混乱。(您可以更有想象力,使用像inotify-tools这样的工具来避免显式轮询,但这可能不值得您费力。)

不幸的是,这并不能解决构建可能失败的问题(除非您正在使用的.tar文件是已知良好的发行版,在这种情况下,您似乎不太可能想要每10秒检查一个新文件)。您可能想创建一个目录,在那里解压,只有在make成功的情况下才替换旧版本。大致是这样的:

代码语言:javascript
复制
tar -zxf kinect.tar
cd kinect
if make
then
    cd ..
    rm -rf kinect.good
    mv kinect kinect.good
    cd kinect.good
    killall lebron
    ./lebron &
fi
cd .. # make sure we always stay in the original directory
票数 1
EN

Stack Overflow用户

发布于 2012-02-11 12:25:29

这是对上面@tekknolagi评论的回复-使用它来使回复更具可读性。

检查更新的脚本

代码语言:javascript
复制
checksum=`md5sum kinect.tar` 

    while [ 1 ] 

do 
    sleep 10 
    newsum=`md5sum kinect.tar` 
    if [ "$newsum" != "$checksum" ] 
    then 
       # Inform you that the file has changed (email perhaps).
    fi 

我假设您是通过网络(FTP?)接收tar文件的。如果是这样,请执行以下操作

1) FTP到不同的文件名2) FTP一个小的大小(1字节)以指示FTP已完成3)修改上述脚本以检查步骤2接收到的文件。如果找到,请将其删除(或者最好将其重命名以便于恢复),删除旧的kinect.tar文件。将步骤1中的文件移至适当位置

1) FTP到不同的文件名2)获取FTP以删除kinect.tar 3)获取FTP以将文件从1)移至适当位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9233686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档