执行 Unix 查找命令时的进度条



我有一个简单的Unix shell脚本,它正在执行一个耗时的find命令。在它执行之前,我的脚本似乎没有响应。然而,它实际上是在现实中运行的。 如何在执行find命令之前添加进度条或打印点?

我想打印一些点或哈希,直到doSomething正在执行函数。

function doSomething()
{
# Time-consuming 'for' loop below
for var in `find XXXXXX`
do
# Some more processing
done;
}
# Call the function doSomething. Need the progress DOTS till doSomething is executing
doSomething
# Remaining script processing

我尝试过谷歌搜索,但没有一个解决方案适合我想要实现的目标。有什么建议吗?

正如评论中所建议的,一个简单的微调器怎么样?很容易在awk中敲出一些东西,这会将输入复制到标准输出并将微调器打印到标准错误:

$ cat spinner.awk
{ printf "%sr", substr("|/-\", NR % 4 + 1, 1) > "/dev/stderr" }
1

然后你可以通过管道find

for var in `find XXXXXX | awk -f spinner.awk`
do
#some more processing
done;

您可以在后台运行微调器

#!/usr/bin/env bash
spinner() {
local s="|/-\"
local -i i=0
while :; do
printf "%s\r" "${s:$((i++%4)):1}" >&2
sleep .05
done
}
function doSomething()
{
# time consuming for loop below
# See: https://github.com/koalaman/shellcheck/wiki/SC2044
for var in $(find XXXXXX)
do
: #some more processing
done
}
# Start the spinner in the background
spinner &
# Get the spinner PID
spinner_pid=$!
#call the function doSomething. Need the progress DOTS till doSomething is executing
doSomething
# Terminate the background running spinner
kill $spinner_pid
# remaining script processing

从 OP 中不清楚 find 命令选择了多少个文件,以及 do-something 是否对整体处理时间有任何重大影响。

假设其中一种常见情况,其中 (1(find将扫描大量文件夹 (2( 相对较少的匹配项和 (3( 每个文件的处理量很少,则可以通过记录扫描的目录来创建进度指示。

如果原始查找结果使用的是find STARTING-POINT ... FIND-EXPRESSION,则修改后的命令为find STARTING-POINT '(' LOGGING-EXPRESSION ')' -o '( FIND-EXPRESSION ')'

每当查找开始扫描新文件夹时,以下脚本都会生成进度报告。请注意,如果原始查找依赖于隐式 -print,则 FIND-EXPRESSION 应包含显式的"-print"。

find STARTING-POINT   
'(' -type d -maxdepth 3 -fprintf /dev/stderr "Processing: %p" ')'   
-o 
'(' FIND-EXPRESSION ')'
# Single Line
find STARTING-POINT '(' -type d -maxdepth N -fprintf /dev/stderr "Processingn: %p" ')' -oo '(' FIND-EXPRESSION ')'

以上会将每个扫描的文件夹(最多 N 级深度(记录到 stderr。

例:

# Find all '*.py' files on the system, showing '*' for each folder
find / '(' -type d -fprintf /dev/stderr "*" ')' -o '(' -name '*.py' -print ')'
# Find system '*.so' files, showing each folder scanned
find /lib /usr/lib '(' -type d  -fprintf /dev/stderr "Scanning: %p" ')' -o '(' -name '*.so' -print ')'

可以对日志记录执行其他自定义 - 在日志记录过滤器中使用"-regex"或"-path">

最新更新