如何优雅的给 cp 和 mv 命令添加一个高颜值的进度条
原创怎样优雅地给 cp 和 mv 命令添加一个高颜值的进度条
在现代的命令行操作中,进度条已经成为了一种非常受欢迎的反馈机制,尤其是在进行文件复制(cp)和移动(mv)等耗时操作时。一个高颜值的进度条不仅能够提升用户体验,还能让等待变得不那么枯燥。以下,我们将介绍怎样为 cp 和 mv 命令添加一个高颜值的进度条。
### 1. 使用 Python 实现进度条
Python 是一种功能强劲的编程语言,可以轻松地实现进度条。以下是一个简洁的 Python 进度条实现方法:
python
import sys
import time
def progress_bar(total, current):
percent = current / total * 100
bar_length = 50
filled_length = int(bar_length * current // total)
bar = '█' * filled_length + '-' * (bar_length - filled_length)
sys.stdout.write(f'\rProgress: [{bar}] {percent:.2f}%')
sys.stdout.flush()
# 示例:复制文件
def copy_file(src, dst):
total = sum(os.path.getsize(f) for f in src)
for src_file in src:
shutil.copy2(src_file, dst)
current = sum(os.path.getsize(f) for f in dst)
progress_bar(total, current)
print(' Copy complete!')
# 示例:移动文件
def move_file(src, dst):
total = sum(os.path.getsize(f) for f in src)
for src_file in src:
shutil.move(src_file, dst)
current = sum(os.path.getsize(f) for f in dst)
progress_bar(total, current)
print(' Move complete!')
### 2. 使用 bash 实现进度条
如果你更钟爱使用 bash 脚本,以下是一个基于 bash 的进度条实现方法:
bash
#!/bin/bash
total=$(du -ch "$@" | grep total$ | cut -f1 | tr -d ' ')
current=0
while [ $current -lt $total ]; do
let current+=1
let percent=$current*100/$total
printf "\rCopying: [%s%s] %s%%" $(printf "%0.s-" {1..50}) $(printf "%0.s*" {1..$(($percent/2))}) $percent
sleep 0.1
done
echo " Copy complete!"
### 3. 使用第三方库实现进度条
如果你不想自己编写进度条,也可以使用一些第三方库来实现。以下是一些常用的第三方库:
- **tqdm**: 一个敏捷的进度条库,拥护 Python、JavaScript 和 Node.js。
- **termprogress**: 一个拥护多进程和异步任务的进度条库,适用于 Python。
- **progresstools**: 一个基于 Python 的进度条库,拥护多种进度条样式。
### 4. 将进度条集成到 cp 和 mv 命令
将进度条集成到 cp 和 mv 命令中非常简洁。以下是一个简洁的示例:
bash
#!/bin/bash
# 复制文件
function copy_with_progress {
cp "$@" | while read line; do
if [[ $line == *percent* ]]; then
percent=$(echo $line | awk '{print $1}' | cut -d '%' -f1)
printf "\rCopying: [%s%s] %s%%" $(printf "%0.s-" {1..50}) $(printf "%0.s*" {1..$(($percent/2))}) $percent
fi
done
echo " Copy complete!"
}
# 移动文件
function move_with_progress {
mv "$@" | while read line; do
if [[ $line == *percent* ]]; then
percent=$(echo $line | awk '{print $1}' | cut -d '%' -f1)
printf "\rMoving: [%s%s] %s%%" $(printf "%0.s-" {1..50}) $(printf "%0.s*" {1..$(($percent/2))}) $percent
fi
done
echo " Move complete!"
}
# 调用函数
case $1 in
copy)
copy_with_progress "$@"
;;
move)
move_with_progress "$@"
;;
*)
echo "Usage: $0 {copy|move} [file1 [file2 ...]]"
;;
esac
### 5. 总结
通过以上方法,我们可以轻松地为 cp 和 mv 命令添加一个高颜值的进度条。这不仅能够提升用户体验,还能让命令行操作更加直观。愿望这篇文章能帮助你实现这一功能。