簡體   English   中英

執行 Unix 查找命令時的進度條

[英]Progress bar while Unix find command is executing

我有一個簡單的 Unix shell 腳本,它正在執行一個耗時的find命令。 在它執行之前,我的腳本似乎沒有響應。 然而它實際上是在現實中運行的。 在執行find命令之前,如何添加進度條或打印點?

我想打印一些點或 hash 直到 function 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中敲出一些東西很容易,它將輸入復制到標准 output 並將微調器打印到標准錯誤:

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

1

然后您可以通過 pipe 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 ')'

每當 find 開始掃描新文件夾時,以下腳本將生成進度報告。 請注意,如果原始查找依賴於隱式 -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 "Processing\n: %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”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM