首先请原谅我对 Unix 缺乏了解——这就是我来这里的原因。我创建了一个 AppleScript,它可以在 Mac 上搜索文件,并通过使用以下命令大大提高了速度:
set MySubfolderTextList to do shell script "find " & MyDirectory & " -type d"
在普通的 Unix 中,这将是find MyDirectory -type d
这为我提供了从名为 的文件夹的顶层递归开始的每个子文件夹的列表MyDirectory
。与我使用常规 AppleScript 制作的旧例程相比,现在的速度是惊人的,但问题是,当我在包含数千个子目录的文件夹上运行此脚本时,我会得到一个小沙滩球几秒钟或几分钟,表明要么发生了什么事情,要么系统崩溃了。我希望我能从 Unix 得到一些关于搜索进度的反馈,否则我的客户会因为程序崩溃而惊慌失措。
答案1
并不真地。考虑到 find 不知道目录树中有什么,而是通过递归读取所有目录列表来查找。 (对不起,双关语。)例如,可能有两个一级目录,其中一个有 1 个文件,另一个有 1000000 个文件。
像复制树这样的事情会有所不同,因为程序可以首先搜索树以找出所有文件的数量和大小,然后使用它来估计完成情况。这是可以完成的,因为文件大小是显式存储的,无需读取整个文件来查找其大小。但据我所知,没有常见的文件系统保存有关树中文件数量的信息。 (并不是说这是不可能的,但即使某些系统这样做,也必须修改 find 才能使用该信息。)
现在,对于沙滩球和冻结的印象,您是否同步运行子进程,以便 UI 在运行时被阻止?这通常是一个坏主意,您可能想要寻找在后台运行外部程序的方法,同时显示一条漂亮的“仍在搜索...”消息。如果用户不耐烦,可以选择中止搜索。
答案2
pv
如果您有计算行数的命令,则可以使用该命令。例如
find ~ -type d | pv -l -F '%b dirs found' >/tmp/output