Python 脚本-扫描当前目录和所有子目录并显示它们的大小。

目录

1.Python 代码实现

2.Python 代码解释(部分)

1. 模块导入

2. ANSI 颜色编码 

3. format_size 函数 

4.get_directory_size 函数 

5. scan_directory 函数 

6. display_progress 函数 

7. main 函数

3.运行脚本 

3.1 基本用法

3.2 使用详细模式


1.Python 代码实现

#!/usr/bin/env python3
"""
Script Name   : folder_size_improved.py
# Author        : XinFan
# Created       : 21 January 2025
# Version       : 1.0.1Description:This script scans the specified directory (or current directory if none provided)and all its subdirectories to calculate and display the total size in a human-readable format.It includes additional features such as progress display, optional verbose mode, and support formultiple directory inputs.Usage:python folder_size_improved.py [directory1] [directory2] ... [-v | --verbose]
"""import os
import sys
import argparse
import threading
import time
from pathlib import Path# ANSI escape codes for colored output
GREEN = "\033[92m"
RED = "\033[91m"
YELLOW = "\033[93m"
ENDC = "\033[0m"def format_size(size):"""Convert size in bytes to a human-readable format."""for unit in ["Bytes", "KB", "MB", "GB", "TB"]:if size < 1024:return f"{size:.2f} {unit}"size /= 1024return f"{size:.2f} PB"def get_directory_size(directory):"""Recursively calculate the size of the given directory."""total_size = 0for entry in os.scandir(directory):if entry.is_file():try:total_size += entry.stat().st_sizeexcept FileNotFoundError:# Handle cases where file is deleted during scanpasselif entry.is_dir():total_size += get_directory_size(entry.path)return total_sizedef scan_directory(directory, progress, lock):"""Scan the directory and update the progress."""size = get_directory_size(directory)with lock:progress[directory] = sizedef display_progress(progress, lock, total_dirs):"""Display progress of the scanning process."""while True:with lock:completed = sum(1 for size in progress.values() if size is not None)if completed >= total_dirs:breakprint(f"\rScanning directories: {completed}/{total_dirs}", end="")time.sleep(1)print()  # Move to next line after scanning is completedef main():# Set up argument parsingparser = argparse.ArgumentParser(description="Calculate the size of specified directories.")parser.add_argument('directories', nargs='*', default=[os.getcwd()],help='Directories to scan. Defaults to current directory if none provided.')parser.add_argument('-v', '--verbose', action='store_true',help='Enable verbose output.')args = parser.parse_args()directories = args.directoriesverbose = args.verboseif verbose:print(f"Scanning directories: {', '.join(directories)}")progress = {}lock = threading.Lock()threads = []total_dirs = len(directories)# Start progress display threadprogress_thread = threading.Thread(target=display_progress, args=(progress, lock, total_dirs))progress_thread.start()# Start scanning threadsfor directory in directories:if os.path.isdir(directory):thread = threading.Thread(target=scan_directory, args=(directory, progress, lock))thread.start()threads.append(thread)else:print(f"{RED}Error:{ENDC} '{directory}' is not a valid directory.")total_dirs -= 1  # Decrement total_dirs since this is not a valid directory# Wait for all scanning threads to finishfor thread in threads:thread.join()# Signal progress thread to finishwith lock:progress['__DONE__'] = Trueprogress_thread.join()# Calculate total sizetotal_size = sum(progress.values())# Display resultsprint(f"\n{GREEN}Total Size:{ENDC} {format_size(total_size)}")if verbose:for directory in directories:size = progress.get(directory, 0)print(f"  {directory}: {format_size(size)}")if __name__ == "__main__":main()

2.Python 代码解释(部分)

1. 模块导入

import os
import sys
import argparse
import threading
import time
from pathlib import Path
  • os:提供与操作系统交互的功能,特别是文件和目录操作。
  • sys:提供对解释器使用的一些变量和函数的访问,特别是用于获取命令行参数。
  • argparse:用于解析命令行参数,提供更强大的参数解析功能。
  • threading:用于创建和管理线程,实现并发处理。
  • time:提供时间相关的函数,例如 sleep
  • pathlib.Path:提供面向对象的路径操作方式,简化路径处理。

2. ANSI 颜色编码 

GREEN = "\033[92m"
RED = "\033[91m"
YELLOW = "\033[93m"
ENDC = "\033[0m"
  • 说明:定义 ANSI 转义码,用于在终端中输出彩色文本。
    • GREEN:绿色文本。
    • RED:红色文本。
    • YELLOW:黄色文本。
    • ENDC:重置文本颜色。

3. format_size 函数 

def format_size(size):"""Convert size in bytes to a human-readable format."""for unit in ["Bytes", "KB", "MB", "GB", "TB"]:if size < 1024:return f"{size:.2f} {unit}"size /= 1024return f"{size:.2f} PB"
  • 说明:将字节数转换为更易读的格式,例如 KB, MB, GB 等。
  • 参数
    • size:文件或目录的大小,以字节为单位。
  • 返回值:格式化后的字符串,例如 "1500.00 Bytes""1.46 KB""0.00 GB"
  • 逻辑
    • 遍历单位列表,从 Bytes 到 TB。
    • 如果当前大小小于 1024,则返回格式化后的字符串。
    • 否则,将大小除以 1024,继续检查下一个单位。

4.get_directory_size 函数 

def get_directory_size(directory):"""Recursively calculate the size of the given directory."""total_size = 0for entry in os.scandir(directory):if entry.is_file():try:total_size += entry.stat().st_sizeexcept FileNotFoundError:# Handle cases where file is deleted during scanpasselif entry.is_dir():total_size += get_directory_size(entry.path)return total_size
  • 说明:递归计算指定目录及其所有子目录的总大小。
  • 参数
    • directory:要扫描的目录路径。
  • 返回值:总大小,以字节为单位。
  • 逻辑
    • 使用 os.scandir 遍历目录内容。
    • 如果是文件,尝试获取文件大小并累加到 total_size
      • 如果文件在扫描过程中被删除,捕捉 FileNotFoundError 异常并跳过。
    • 如果是子目录,递归调用 get_directory_size 并累加其大小。

5. scan_directory 函数 

def scan_directory(directory, progress, lock):"""Scan the directory and update the progress."""size = get_directory_size(directory)with lock:progress[directory] = size
  • 说明:扫描指定目录并更新进度。
  • 参数
    • directory:要扫描的目录路径。
    • progress:一个字典,用于存储每个目录的大小。
    • lock:一个线程锁,用于同步对 progress 的访问。
  • 逻辑
    • 调用 get_directory_size 计算目录大小。
    • 使用 lock 确保对 progress 的线程安全更新。

6. display_progress 函数 

def display_progress(progress, lock, total_dirs):"""Display progress of the scanning process."""while True:with lock:completed = sum(1 for size in progress.values() if size is not None)if completed >= total_dirs:breakprint(f"\rScanning directories: {completed}/{total_dirs}", end="")time.sleep(1)print()  # Move to next line after scanning is complete
  • 说明:在终端中显示扫描进度。
  • 参数
    • progress:一个字典,存储每个目录的大小。
    • lock:一个线程锁,用于同步对 progress 的访问。
    • total_dirs:要扫描的目录总数。
  • 逻辑
    • 进入一个无限循环,每秒更新一次进度。
    • 使用 lock 获取当前完成的目录数量。
    • 如果完成的目录数量达到 total_dirs,则退出循环。
    • 使用 \r 回到行首,覆盖之前的输出。
    • 显示当前扫描进度,例如 "Scanning directories: 5/10"
    • 休眠 1 秒。

7main 函数

def main():# Set up argument parsingparser = argparse.ArgumentParser(description="Calculate the size of specified directories.")parser.add_argument('directories', nargs='*', default=[os.getcwd()],help='Directories to scan. Defaults to current directory if none provided.')parser.add_argument('-v', '--verbose', action='store_true',help='Enable verbose output.')args = parser.parse_args()directories = args.directoriesverbose = args.verboseif verbose:print(f"Scanning directories: {', '.join(directories)}")progress = {}lock = threading.Lock()threads = []total_dirs = len(directories)
  • 说明:主函数,设置命令行参数解析并初始化扫描过程。
  • 逻辑
    • 使用 argparse 设置命令行参数:
      • directories:位置参数,指定要扫描的目录。默认为当前工作目录。
      • -v, --verbose:可选参数,启用详细输出。
    • 获取用户输入的目录列表和详细模式标志。
    • 如果启用详细模式,打印要扫描的目录列表。
    • 初始化 progress 字典,用于存储每个目录的大小。
    • 初始化线程锁 lock
    • 初始化线程列表 threads
    • 获取要扫描的目录总数 total_dirs

3.运行脚本 

打开终端或命令提示符,导航到脚本所在的目录,然后运行以下命令:

python folder_size_improved.py [options] [directories]
3.1 基本用法
  • 扫描当前目录

    python folder_size_improved.py

这将扫描当前工作目录及其所有子目录,并显示总大小。

  • 扫描指定目录:        
    python folder_size_improved.py /path/to/directory

这将扫描指定的目录及其所有子目录。

  •  扫描多个目录
python folder_size_improved.py /path/to/dir1 /path/to/dir2 /path/to/dir3
3.2 使用详细模式

启用详细模式

python folder_size_improved.py -v

python folder_size_improved.py --verbose

这将显示每个目录的具体大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

使用批处理文件清除系统垃圾

第一步&#xff1a;打开记事本&#xff0c;里面的命令如下 echo off echo 正在清理临时文件&#xff0c;请稍候...:: 清理系统临时文件 echo 清理系统临时文件... del /q /f /s "%TEMP%\*.*" del /q /f /s "%WINDIR%\Temp\*.*" rd /s /q "%WINDIR%\T…

Linux——信号量和(环形队列消费者模型)

Linux——线程条件变量&#xff08;同步&#xff09;-CSDN博客 文章目录 目录 文章目录 前言 一、信号量是什么&#xff1f; 二、信号量 1、主要类型 2、操作 3、应用场景 三、信号量函数 1、sem_init 函数 2、sem_wait 函数 3、sem_post 函数 4、sem_destroy 函数 ​​​​​​…

垂直供排水抢险车:守护城市,抗击洪涝|深圳鼎跃

我国面积幅员辽阔&#xff0c;其灾害种类多样&#xff0c;而洪涝灾害是其中最常见的灾害&#xff0c;其容易受强降雨的影响&#xff0c;严重影响人民群众的日常生活。而在洪水肆虐的场景中&#xff0c;快速、高效地排涝和供水是防止次生灾害、保护人民生命财产安全的关键环节。…

Social LSTM:Human Trajectory Prediction in Crowded Spaces | 文献翻译

概要 行人遵循不同轨迹以避免障碍物和容纳同行者。任何在这种场景中巡航的自动驾驶车辆都需要能够遇见行人的未来位置并相应地调整其路线以避免碰撞。轨迹预测问题能够被看作一个顺序生成任务&#xff0c;其中我们对基于行人过去的位置预测其未来的轨迹感兴趣。根据最近RNN&am…

React+AntDesign实现类似Chatgpt交互界面

以下是一个基于React和Ant Design搭建的简单ChatGPT风格前端交互界面代码框架示例&#xff0c;该示例实现了基本的用户输入、发送请求以及展示回复的功能。假设后端有一个模拟接口来处理请求并返回回复。 1. 项目初始化&#xff1a; 确保你已经安装了Node.js和npm。通过以下命…

与“神”对话:Swift 语言在 2025 中的云霓之望

0. 引子 夜深人静&#xff0c;是一片极度沉醉的黑&#xff0c;这便于我与深沉的 macbook 悄悄隐秘于其中。一股异香袭来&#xff0c;恍惚着&#xff0c;撸码中身心极度疲惫、头脑昏沉的我仿佛感觉到了一束淡淡的微光轻洒在窗边。 我的对面若隐若现逐渐浮现出一个熟悉的身影。他…

iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析

引言 在 iOS 开发中&#xff0c;网络请求是常见且致其重要的功能之一。从获取资料到上传数据&#xff0c;出色的网络请求框架能夠大大提升开发效率。 Alamofire 是一个极具人气的 Swift 网络请求框架&#xff0c;提供了便据的 API 以完成网络请求和响应处理。它支持多种请求类…

68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)

<?php // 声明命名空间&#xff0c;遵循 PSR-4 自动加载规范&#xff0c;命名空间为 Home\Controller namespace Home\Controller;// 导入 Think\Controller 类&#xff0c;以便扩展该类 use Think\Controller;// 定义 IndexController 类&#xff0c;继承自 Think\Control…

【C++】引用(上)

1、引用的基本使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型&#xff08;该数据类型要与原名的数据类型一致&#xff09; &别名原名&#xff1b; 示例&#xff1a; #include<iostream> using namespace std; int main() {int a 10;int& …

JDBC实验测试

一、语言和环境 实现语言&#xff1a;Java。 环境要求&#xff1a;IDEA2023.3、JDK 17 、MySQL8.0、Navicat 16 for MySQL。 二、技术要求 该系统采用 SWING 技术配合 JDBC 使用 JAVA 编程语言完成桌面应用开发。 三、功能要求 某电商公司为了方便客服查看用户的订单信…

外包公司名单一览表(成都)

大家好&#xff0c;我是苍何。 之前写了一篇武汉的外包公司名单&#xff0c;评论区做了个简单统计&#xff0c;很多人说&#xff0c;在外包的日子很煎熬&#xff0c;不再想去了。 有小伙伴留言说有些外包会强制离职&#xff0c;不行就转岗&#xff0c;让人极度没有安全感。 这…

一些硬件知识【2025/1/21】

小米2K摄像头拆解&#xff1a; 这种小转接板空余部分一般全部打上过孔&#xff1a; 摄像头下面的SENSOR,这一部分才是摄像头的核心&#xff1a; 干硬件多久跳槽一次比较合适&#xff1f;3年跳一次可以吗&#xff1f; eMCC存储芯片外面那一圈焊盘是做什么用的&#xff1f; 没有…

WPF实战案例 | C# WPF实现计算器源码

WPF实战案例 | C# WPF实现计算器源码 一、设计来源计算器应用程序讲解1.1 主界面1.2 计算界面 二、效果和源码2.1 界面设计&#xff08;XAML&#xff09;2.2 代码逻辑&#xff08;C#&#xff09;2.3 实现步骤总结 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&a…

【HBuilderX 中 Git 的使用】

目录&#xff1a; 一&#xff1a;安装必要的版本控制工具二&#xff1a;把Github上的项目克隆到本地三&#xff1a;将本地的项目上传到Github上 一&#xff1a;安装必要的版本控制工具 1️⃣ 安装 TortoiseGit 工具&#xff0c;下载地址&#xff1a;https://tortoisegit.org/do…

浅谈 JVM

JVM 内存划分 JVM 内存划分为 四个区域&#xff0c;分别为 程序计数器、元数据区、栈、堆 程序计数器是记录当前指令执行到哪个地址 元数据区存储存储的是当前类加载好的数据&#xff0c;包括常量池和类对象的信息&#xff0c;.java 编译之后产生 .class 文件&#xff0c;运…

OpenCV简介、OpenCV安装

OpenCV简介、OpenCV安装 本文目录&#xff1a; 零、时光宝盒 一、OpenCV简介 二、OpenCV图像处理基础知识 三、OpenCV-Python环境安装 2.1、纯python环境下安装OpenCV 2.2、Anaconda管理环境下安装 OpenCV 四、如何用OpenCV 中进行读取展示图像 五、OpenCV读取图像、显…

使用Chrome和Selenium实现对Superset等私域网站的截图

最近遇到了一个问题&#xff0c;因为一些原因&#xff0c;我搭建的一个 Superset 的 Report 功能由于节假日期间不好控制邮件的发送&#xff0c;所以急需一个方案来替换掉 Superset 的 Report 功能 首先我们需要 Chrome 浏览器和 Chrome Driver&#xff0c;这是执行数据抓取的…

算法专题(三):二分查找

本篇还是像之前一样&#xff0c;以举例子的形式向大家讲解&#xff01;每道题的题目均是传送门&#xff01;点击跳转对应题&#xff01; 目录 一、二分查找 1.1 题目 1.2 思路 1.3 代码实现 总结&#xff08;模版&#xff09; 朴素版&#xff1a; 二、在排序数组中查找…

在k8s中部署一个可外部访问的Redis Sentinel

1.前提条件&#xff1a; 1.部署了multus 想要k8s外部能访问k8s内部的redis&#xff0c;redis-server启动时必须使用multus的IP 2.helm客户端安装 2.开始安装 准备3个multus ip 10.10.10.130 10.10.10.131 10.10.10.132 apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttac…