是否有一个进度条可以根据在 for 循环中找到并完成的检测到的文件数量显示视觉上完成的进度,如下所示?
mkdir -p hflip; for i in *.mp4; do ffmpeg -n -i "$i" -vf hflip -c:a copy hflip/"${i%.*}.mp4"; done
答案1
我建议为进度条保留一个字符串,为每个文件填充一些字符,并在循环期间将它们替换为另一个字符:
bar=""; for i in *.EXT; do bar=$bar-; done; for i in *.EXT; do PROGRAM OPTION1 OPTION2 "$i"; bar=${bar/-/=}; printf "%s\r" $bar; done
但由于你ffmpeg
给出了输出,它会干扰进度条的打印。您可以将输出重定向到/dev/null
根本看不到它,但最好知道是否出了问题,因此我建议将其重定向到 和 的日志文件中stdout
,stderr
这次打印为多行脚本以使其更具可读性:
mkdir -p hflip
bar=""
for i in *.mp4; do
bar=$bar-
done
for i in *.mp4; do
ffmpeg -n -i "$i" -vf hflip -c:a copy hflip/"${i%.*}.mp4" > /tmp/log.out 2> /tmp/log.err
bar=${bar/-/=}
printf "%s\r" $bar
done
more /tmp/log.err
这将在处理文件后显示包含所有错误的日志。您还可以显示log.out
,但因为这是关于 的ffmpeg
,所以它喜欢输出很多大多数人不想阅读的内容。 (-;
答案2
尝试这样的简单解决方案(您需要全面质量管理包裹):
for i in *.EXT; do PROGRAM OPTION1 OPTION2 "$(echo $i|tqdm)"; done
假设您的文件名中没有“有趣”的字符。
答案3
我建议两种选择
1. bash
shellscript用来pv
连续显示进度
安装pv
sudo apt install pv # in Debian and Ubuntu, other commands in other distros
带有演示程序的 Shellscript
#!/bin/bash
# if only files (if directories, you may need another command)
cnt=0
for i in dir/*
do
cnt=$((cnt+1))
done
files="$cnt"
> log
> err
for i in dir/*
do
ls "$i" >> log 2>> err # simulating the actual process
sleep 2 # simulating the actual process
echo "$i"
done | pv -l -s "$files" > /dev/null # progress view using lines with $i
演示
过程中
$ ./pver
2.00 0:00:06 [0,00 /s] [===============> ] 40% ETA 0:00:09
完成后
$ ./pver
5.00 0:00:10 [ 499m/s] [======================================>] 100%
2. bash
shellscript按需显示当前进度状态
for
在后台循环,运行program
和一个计数器cnt
while
循环寻找字符输入(如果c
,则告诉我们进度)
没有进度条,但只要您愿意,您就可以获得有关进度的状态更新。
带有演示程序的 Shellscript
#!/bin/bash
cnt=0
echo "0" > clog
program () {
ls "$1"
sleep 5
}
# main
files=$(ls -1 dir|wc -l)
for i in dir/*
do
program "$i"
cnt=$((cnt+1))
echo "$cnt" > clog
done > log &
while [ "$cnt" != "$files" ]
do
cnt=$(cat clog)
read -sn1 -t1 chr
if [ "$chr" == "c" ]
then
echo "$cnt of $files files processed; running ..."
fi
done
echo "$cnt of $files files processed; finished :-)"
演示
$ ./loop
0 of 5 files processed; running ...
3 of 5 files processed; running ...
5 of 5 files processed; finished :-)
$ cat log
dir/file1
dir/file2
dir/file3
dir/file4
dir/file w space