【问题标题】:Continuously for a file, but alert only once连续为一个文件,但只警告一次
【发布时间】:2013-09-04 11:12:08
【问题描述】:

本帖已更新,请看下方解决方案。

我需要检查文件夹中是否存在文件,但该文件并不总是存在。

我做了一个这样的脚本:

#!/bin/sh 虽然是真的;做 文件=/路径/到/文件 如果 [[ "$file" = *文件名* ]] 然后 echo "$ 文件存在" 别的 回声“没有礼物” 菲 睡觉 3 完毕

工作完美,除了“$file is present”不断重复,直到我删除或移动文件。 我可以在 "echo "$file is present" 之后插入哪个命令来停止警报但继续检查该文件(例如,当文件再次可用时)?

谢谢。

由于我要等到 8 小时才能添加答案,所以我在这里发布我的解决方案:

无论如何我已经使用这个脚本解决了:将文件的时间与当前日期进行比较,然后使用“触摸”将日期更改为 10 秒前:

#!/bin/sh 虽然是真的 做 cd $(目录名 "$0") 当前=$(密码) cd /boot/home/下载 最后=$(ls -t | 头 -n1) name=$(basename "$last") 文件日期=$(日期 -r "$last" +%G%m%d%H%M%S) 当前日期=$(日期+%G%m%d%H%M%S) if [ "$filedate" -eq "$currentdate" ] 然后 echo "$name" "存在" touch -d '-10 seconds' "$name" 菲 完毕

现在可以根据文件名独立运行! 每个新文件只提醒我一次,并继续关注该文件夹:-)

为了保留整个脚本的历史,下面是iamauser的脚本。我对这个脚本进行了一些改进:现在它会提醒我文件夹中的每个新文件(独立于名称、种类等),并提醒我删除文件:-)

#!/bin/bash cd /启动/主页 文件名=$(ls -t | 头 -n1) tstamp=$(stat --print "%Y" "$filename") 虽然是真的;做 prev=$(ls "/boot/home/Downloads" | tr '\n' '\n' > /tmp/prev.txt) 检查=$(ls -t /boot/home/Downloads | head -n1) 如果 [ ! -d "$文件名" ];然后 after=$(ls "/boot/home/Downloads" | tr '\n' '\n' > /tmp/after.txt) echo "不存在"; 睡觉 5; elif [[ "$filename" == "$filename" && $tstamp -ne $(stat --print "%Y" "$filename") ]];然后 睡觉 2 差异=$(comm -2 -3 "/tmp/after.txt" "/tmp/prev.txt">/tmp/Diff.txt) 丢失=$(cat /boot/common/cache/tmp/Diff.txt) alert --idea "/boot/home/Downloads: $check 是此文件夹中最新的文件。"; alert --idea "/boot/home/Downloads: $lost removed."; tstamp=$(stat --print "%Y" "$filename") 别的 睡觉 3; 菲 完毕

【问题讨论】:

  • 你能举个例子吗?
  • 这可行,但会消耗您的处理能力或炸毁您的驱动器。尝试在循环结束时添加至少 10 秒的睡眠 (sleep 10)。

标签: bash file for-loop


【解决方案1】:

这样的事情可能会奏效。我正在检查文件的时间戳以检查文件夹中是否有相同文件名的新副本。

#!/bin/bash                                                                                                                                                                                         

filename="/path/to/file"                                                                                                                                                                                     
tstamp=$(stat --print "%Y" "$file")                                                                                                                                                                 
while true; do                                                                                                                                                                                      
    if [ ! -f "$filename" ]; then                                                                                                                                                                       
        echo "Not present";
        sleep 5;                                                                                                                                                             
    elif [[ "$filename" == "myfile" && $tstamp -ne $(stat --print "%Y" "$filename") ]]; then                                                                                                              
        echo "$filename is present";                                                                                                                                                                    
        tstamp=$(stat --print "%Y" "$filename")                                                                                                                                                         
    else                                                                                                                                                                                            
        sleep 3;                                                                                                                                                                                    
    fi                                                                                                                                                                                              
done   

我通过在脚本运行时触摸文件名来测试脚本,每次触摸时,它都会打印$filename is present

【讨论】:

  • 感谢您的回复,iamauser!
  • 是的,有效。但我找到了另一个解决方案:看看我原来的帖子。无论如何,我会投票给你 :-) Ops.. 为了投票,我需要 15 声望!
  • 我建议您改用 iamuser 的解决方案,因为它是正确的非 hacky 方法,并且您的其他脚本必须在重新创建文件的那一刻赶上以使条件为真。您还必须保留touch-ing 文件,这会更改其时间戳并使其不一致。如果基于它,其他程序也可能无法按预期运行。
【解决方案2】:

当然,konsolebox;你说得对。如果我添加睡眠以减少 CPU 使用率,我的脚本也不完美。 无论如何,也许,我错过了来自 iamauser 的脚本: 上面的脚本在文件不存在时打印回显,但在存在时不打印回显。为什么?

无论如何,由于我想尝试一下,我也在考虑另一种方法:使用“ls -1 | wc -l”检查文件夹中的文件数量,添加一个新文件并添加一个新文件的数量文件比“ls -1 | wc -l”+1 并且,因此,我可以从文件名中单独收到警报。如果有任何名称的文件,脚本应该提醒我一次,同时继续检查文件夹中的新文件。 还有什么建议吗?

谢谢!

更新

好的:这是脚本的最终修订版: 当在文件夹中写入新文件时,此脚本会提醒我。如果我删除此文件,脚本会提醒我该文件夹中存在的最新文件。 非常好,因为这是我一直在寻找的 :-)

自从我在 Haiku 上,我也将“echo”替换为 alert,一个警告窗口,一种图形“echo”。

#!/bin/bash cd /启动/主页 文件名=$(ls -t | 头 -n1) tstamp=$(stat --print "%Y" "$filename") 虽然是真的;做 检查=$(ls -t /boot/home/Downloads | head -n1) 如果 [ ! -d "$文件名" ];然后 echo "不存在"; 睡觉 5; elif [[ "$filename" == "$filename" && $tstamp -ne $(stat --print "%Y" "$filename") ]];然后 alert --idea "/boot/home/Downloads: $check 是此文件夹中最新的文件"; tstamp=$(stat --print "%Y" "$filename") 别的 睡觉 3; 菲 完毕

【讨论】:

  • 好的:我看到 iamauser 的脚本在更新或修改给定文件时提醒我 :-) 我如何更改脚本以提醒我文件夹中的每个新文件?现在我已经改变了“filename=$(ls -t | head -n1)”
  • 我回复自己 :-) 因为我想检查文件夹中的更改(例如该文件夹中的新文件),所以我再次以这种方式更改了 iamauser 的脚本:“如果 [! -d "$filename" ]; 然后 " 所以我在一个文件夹中运行这个脚本,我可以检查新文件的存在:-)
猜你喜欢
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 2014-05-04
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多