Linux find命令-显示进度


24

我想知道在使用linux搜索文件时是否有任何方式显示某种进度信息find。我经常发现自己搜索文件的一个大磁盘上,某种进度指示器将是非常有益的,像酒吧,或者至少当前目录中的“查找”搜索。有没有做任何脚本,或者不find支持一些挂钩?


感谢您的回答,我将检查所有解决方案,并确定哪个更好。如果由我决定,我会将所有答案标记为已接受。
弗拉德·巴尔莫斯

取决于您使用的搜索条件,查找的速度要比查找的速度快得多
B14D3 2011年

Answers:



8

一个叫做pv(管道查看器)的小实用程序可能会有所帮助。从Peteris Krumins 的精彩总结中

管道查看器是基于终端的工具,用于监视通过管道的数据进度。

您可以通过多种方式使用pv。在这里玩耍时,我将其放在管道之后,以监视find生成的输出的进度(应将stdin传递给stdout保持原状)

find / -mtime -1h | pv > /dev/null

它将显示如下输出:

6.42MB 0:01:25 [31.7kB/s] [         <=>      ]

(我将stdout重定向到/ dev / null,所以我可以看到进度条正在运行而没有输出飞散。这可能不是您的查找意图,因此请相应地进行调整)

老实说,我不确定这在野外的效果如何。对于像上面这样的“昂贵”发现(从根开始遍历),它似乎工作得很好。对于目录树中更深层节点中的更简单命令,pv惨败。这些命令将立即返回结果,因此此处可能没有进度条。

无论如何,试一下,看看它是否完全可以满足您的需求。至少值得深思。


该进度条将显示什么?无论是find,也不pv知道搜索需要多久,,所以不能计算出百分比。我们在pv输出中看到的就是自开始搜索以来的时间。
minaev 2011年

这是对的。我以为某处发生了一些不可思议的事情,使pv可以检查目录遍历的进度(这是不正确的)。给定恒定速率的标准输入,pv只需以恒定频率移动进度条。尝试yes | pv > /dev/null观察
tcdyl 2011年

1
+1一个很好的工具
弗拉德Balmos

判断进度并非无关紧要。甚至加载页面的Web浏览器都无法做到这一点。我猜可以将文件内容除以文件大小,但是对于Unix流,通常不知道数据总量,并且该工具旨在灵活地处理任何类型的流数据,而不仅仅是文件。
Sridhar Sarnobat '16

7

我今天进行了搜索,并通过Google到达了这里。我在OS X上运行了很长时间,watch但显然不存在。所以这是另一个解决方案:

lsof -Fn -a -c find -d cwd +r 10

  • lsof =打开文件列表
  • -Fn=仅显示文件/目录的名称(前缀为'n'字符,如果您希望完整lsof输出,请跳过此步骤
  • -a=告诉lsof仅显示符合所有条件的行(默认情况下,它显示符合任何条件的行)
  • -c find=显示由名为的进程打开的文件/目录find(实际上,其名称以开头的进程find,但区分大小写,因此Finder不会显示)
  • -d cwd =用FD(文件描述符)cwd(当前工作目录)显示行
  • +r 10 =每10秒显示一次输出,直到找不到打开的文件为止(查找完成)

这将显示目录find正在每10秒处理一次,因此应该告诉您目录是否find仍在工作以及进度如何。


5

有一个使用findin 进行并行搜索的示例man find。使用它,您可以对每个项目执行多项检查,并根据适用的条件执行多项操作。第一次检查可能是,例如simple -print,因此所有名称都被打印到stdout。第二张支票将做您想要的。就像是:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

如果第二个检查也应显示文件名,则可以使用将其中一个重定向到stderr -fprint /dev/stderr


我尚未对此进行测试,但我认为这是正确的方法。
罗尔夫

2

AFAIK并非如此,实现它并非易事。

嗯 也许一个脚本find <target dir> -type d先运行,存储列表,然后find <list item> -maxdepth 1 <rest of find parameters>在for循环中运行a之前回显每个目录。

请注意,您要换一个/显着/的性能损失,以换取能够隐约看到它在做什么的交换。


1

这是由find打开的当前文件的列表,因此与find正在“立即” 查找的文件相同。

它轻巧,只是find 每秒使用的文件描述的查询地址,不会干扰find本身。您也可以使用任何所需的程序来执行此操作。

# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'

grep -v /dev/是隐藏文件STDOUT,STDIN和STDERR,这是用于接收和您的控制台上显示的数据文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.