【问题标题】:tail-like continuous ls (file list)尾状连续ls(文件列表)
【发布时间】:2013-09-09 20:16:19
【问题描述】:

我正在监视在 linux 文件夹中创建的新文件。我不时地在其中发出一个“ls -ltr”。但我希望有一个程序/脚本可以自动打印它,并且只有最新的条目。我做了一个短暂的while循环来列出它,但它会重复那些不是新的条目,并且当没有新文件时它会保持我的屏幕滚动。我已经了解了“watch”,它确实显示了我想要的内容并每 N 秒刷新一次,但我不想要 ncurses 界面,我正在寻找类似 tail 的东西:

  • 连续
  • 仅显示新内容
  • 在我的终端中打印,所以我可以在后台运行它并做其他事情,并时不时地查看输出,然后与我正在做的事情混合:D

总结:获取输入,与之前的输入进行比较,只输出新的。 这样做的东西听起来不像是一个奇怪的工具,我可以看到它也被用于其他情况,所以我希望它已经存在,但我找不到任何东西。有什么建议吗?

【问题讨论】:

  • 你在运行什么发行版?
  • 我正在运行薄荷。我正在研究“inotify”,我从来没有听说过它,显然它没有做我想要的,只是可能帮助我编写一个脚本来做到这一点。
  • @msb 当然会,看看那里的第二个(低投票)答案。它在我的 ubuntu 机器上开箱即用(sudo apt-get install inotify-tools)

标签: linux shell ls


【解决方案1】:

您可以使用非常方便的命令watch

watch -n 10 "ls -ltr"

您将每 10 秒收到一个ls

如果您添加tail -10,您只会获得最新的 10 个。

watch -n 10 "ls -ltr|tail -10" 

【讨论】:

  • 这将忽略创建者在创建后不久将文件的时间更改为零的文件。
  • 正如我原来的问题中提到的,手表并不是我想要的,因为如果没有足够的新文件,它会重复最后的文件,并且它有一个 ncurses 界面。 :-/
  • 哦,对不起 - 我很高兴回答时错过了你提到的诅咒。我经常使用手表。
【解决方案2】:

如果您可以访问inotifywait(如果您使用的是 Debian/Ubuntu,则可以从 inotify-tools 包中获得)您可以编写如下脚本:

#!/bin/bash

WATCH=/tmp

inotifywait -q -m -e create --format %f $WATCH | while read event
do
    ls -ltr $WATCH/$event
done

这是一个单行程序,它不会为您提供与 ls 相同的信息,但它会打印出文件名:

inotifywait -q -m -e create --format %w%f /some/directory

【讨论】:

  • 谢谢,成功了。我把它做成了一个脚本,我得到了 $WATCH 作为参数。谢谢!
  • 作为附加注释,该脚本列出了所有新文件,但文件大小通常为零,这是因为 ls 在文件创建之后但在其内容添加之前执行。我在 ls 之前添加了一个睡眠,现在一切都很完美。 :-) 您(或我)可以将其添加到您的答案中吗?
  • -e create 更改为-e close_write 可以解决这个问题吗?
  • :是的!令人惊奇的是这个 inotify 的东西,我一定会更多地了解它。再次感谢。 :)
【解决方案3】:

这适用于cygwinLinux。以前的一些写入文件的解决方案会导致磁盘抖动。

这个脚本没有这个问题:

SIG=1
SIG0=SIG
while [ $SIG != 0 ] ; do
 while [ $SIG = $SIG0 ] ; do
   SIG=`ls -1 | md5sum | cut -c1-32`
   sleep 10
 done
 SIG0=$SIG
 ls -lrt | tail -n 1
done

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多