如何在 Linux 命令行中知道文件是否已下载完成?

如何在 Linux 命令行中知道文件是否已下载完成?

如果您通过命令行在 Linux 中下载大型文件,是否有命令可以知道它是否已完成?目前,我只检查文件大小是否与预期文件大小相同,但如果您不知道预期文件大小怎么办?当前ls显示确切的文件名(即file.zip),而不是类似file.zip.temp或 之类的内容,即使文件当前正在下载。

答案1

如果您使用 下载wget,您可以简单地检查实例是否仍在运行:

ps -ef | grep wget | grep -v grep

另外,你可以检查文件是否仍然被打开wget。显然,在这里替换路径。

lsof /path/to/downloaded/file

答案2

如果您不需要在后台执行 wget,请不要这样做,这只会导致复杂情况。

我反对使用检查ps -C wgetpidof wget(更短的,可能是非 POSIX 的,等同于ps -ef | grep wget | grep -v grep)之类的解决方案,因为它们会考虑任何一个wget而不仅仅是您感兴趣的那个,如果您的机器不只执行一项任务,这可能是一个不可假设的假设。

如果您在脚本中,wget & WGETPID=$!则可以检查该 PID。或者您可以简单地wait等待您的后台进程完成。

为了区分成功下载和不成功下载,采取一些措施可能很重要。if wget ... ; then touch wget_ok ; else touch wget_error ; fi

答案3

如果您运行多个wget命令该怎么办?

如果您需要适应这种情况,那么您可以做一些不同的事情:

  • 您可以将进度传送到具有已知名称的文件并进行检查。
  • 您可以强制您在问题中想到的想法,下载到临时文件,然后在第二个命令中重命名它。
  • 您可以在流程完成后写入一个令牌,即

    wget 'file'; touch file.is.done
    

答案4

我更喜欢声音信号,所以如果我开始一个长时间的操作(不仅是 wget,而且是任何耗时资源的操作),而我不想立即观看,我会使用类似

`LONG_COMMAND && SOUND_OK || SOUND_ERROR`

因此,即使我需要立即知道它何时完成,我也可以同时做其他事情,而不必时不时地打断自己进行检查,我只需听到结果(如果SOUND_OK第一个命令的退出状态是0,则SOUND_ERROR在其他情况下)并检查它即可一次当它完成时。如果您只需要知道您的任务已完成,您甚至可以继续当前活动。LONG_COMMAND可以是wget,并且正如SOUND_OK我所喜欢的那样echo -e "\a" >/dev/console,但您可以使用命令播放任何音频样本。

只要 wget 可以产生几个不同的退出代码,就可以使用它们来确定“bios 风格”中的警报命令,如下所示

wget URL;\
CODE=$?;\
beep;\
[ $CODE -gt 0 ] && while true; do
 for peek in `seq 1 $CODE`; do
 beep; sleep 1;done
sleep 3; done

相关内容