如何优雅的给 cp 和 mv 命令添加一个高颜值的进度条

原创
admin 2小时前 阅读数 7 #Linux
文章标签 Linux

怎样优雅地给 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 命令添加一个高颜值的进度条。这不仅能够提升用户体验,还能让命令行操作更加直观。愿望这篇文章能帮助你实现这一功能。

本文由IT视界版权所有,禁止未经同意的情况下转发

热门