Linux bash脚本 批量创建文件

2024-09-01 19:44
文章标签 linux 创建 脚本 批量 bash

本文主要是介绍Linux bash脚本 批量创建文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一. 需求
  • 二. 前置知识
  • 一. 无进度条版本
    • 1.1 知识点
    • 1.2 代码
    • 1.3 效果
  • 二. 有进度条版本
    • 2.1 代码
    • 2.2 效果


一. 需求

在当前目录下生成指定年份的文件,要求从生成1月到12月,每个月份的文件。

  • 若用户不指定年份,则默认生成当前年的文件
  • 提示文字彩色显示
  • 创建一个文字版本进度条,实时显示创建的进度
  • 每个月的天数不一样
  • 2月份可能存在闰年

二. 前置知识

echo命令可以使用-e配置项来转义ANSI 转义码,进而打印彩色文本。

  • ANSI 转义码的基本格式是 \033[<code>m,其中<code>是一个代表颜色或样式的数字。
    • 红色:\033[31m
    • 绿色:\033[32m
    • 黄色:\033[33m
    • 蓝色:\033[34m
    • 洋红:\033[35m
    • 青色:\033[36m
    • 白色:\033[37m
  • 彩色文本打印完之后,可以使用\033[0m来重置颜色回到默认值。
    如果不重置颜色回到默认值的话,整个控制台的颜色都会受到影响。

一. 无进度条版本

1.1 知识点

local year=$1

  • local :声明变量是局部变量
  • year=$1:将用户传入的第一个参数赋值给year变量。
    在bash中,用于变量赋值的=的前后是不能有空格的,这一点和其他编程语言不同。

if [ -z "$year" ];

  • -z:是一个字符串操作选项,用于检查字符串的长度是否为零。
    常用于判断变量是否为空(即未设置或值为空字符串)。
    如果字符串的长度为零,则返回真(true)。
  • "$year"$year是我们定义的变量名,只有被双引号"包裹,才会解析为对应的变量值。
    如果被单引号'包裹,'$year'只会被解析为普通字符串。

$(date +%Y)

  • $():用于执行括号内的命令,并将命令的输出作为字符串返回。
  • date:是一个 Unix/Linux 系统上的命令,用于显示或设置系统的日期和时间。
  • +%Y:是 date 命令的格式化选项。%Y 指定了年份的四位数字格式。
    例如,在 2024 年执行时,date +%Y 会输出 2024。

if [[ ! "$choice" =~ ^[Yy]$ ]];

  • [[ ... ]]:Bash 中的扩展测试命令,提供了更强大的条件测试能力。
    [ ... ] 相比,[[ ... ]] 支持更多的运算符,并且在处理复杂条件(正则表达式)时,更为安全和灵活。
  • "$choice" =~ ^[Yy]$
    • =~ 是 Bash 中用于模式匹配的操作符。
    • 用于将变量的值与一个正则表达式进行匹配。
    • 如果匹配成功,条件为真;如果匹配失败,条件为假。
    • 用于限定用户输入的值只能为y或者Y

date -d "$month/01/$year +1 month -1 day" +%d

  • date -d-d选项允许指定一个日期字符串并对其进行计算。
  • +1 month -1 day
    • +1 month:将日期加一个月,计算出指定月份的下个月的第一天。
    • -1 day:从上一步计算得到的日期减去一天,得到当前指定月份的最后一天
    • +%d:date 命令的格式化选项,表示只输出日期中的
  • date -d "02/01/2024 +1 month -1 day" +%d29

seq -w 01 29

  • 用于生成从起始值到终止值的序列
  • seq [选项] 起始值 终止值
  • -w: 用于零填充输出,使得所有输出的数字具有相同的宽度。
    在此案例中,用于生成01 02 03 ...

1.2 代码

create_files_for_year() {# 局部变量local year=$1# 如果没有传入年份参数,则提示用户使用当前年份if [ -z "$year" ]; then# 获取当前年份year=$(date +%Y)# 红色文字提示echo -e "\033[31m没有指定年份,默认使用当前年份 ${year} 进行创建。\033[0m"read -p "是否继续?(y/n): " choiceif [[ ! "$choice" =~ ^[Yy]$ ]]; then# 蓝色文字提示echo -e "\033[34m文件创建取消...\033[0m"returnfifi# 绿色文字echo -e "\033[32m⇓⇓⇓开始创建文件⇓⇓⇓\033[0m"# 睡眠1秒,显示文件创建的绿色文字sleep 1# 循环1月到12月,批量创建文件 for month in {01..12}; dofor day in $(seq -w 01 $(date -d "$month/01/$year +1 month -1 day" +%d)); do# 将当前创建的文件打印到控制台上echo "./${year}${month}${day}_GIME_PAY_HIST.csv.gz"# 创建文件touch ./${year}${month}${day}_GIME_PAY_HIST.csv.gzdonedone
}

1.3 效果

在这里插入图片描述


二. 有进度条版本

2.1 代码

create_files_for_year() {# 局部变量local year=$1# 如果没有传入年份参数,则提示用户使用当前年份if [ -z "$year" ]; thenyear=$(date +%Y)# 红色文字提示echo -e "\033[31m没有指定年份,默认使用当前年份 ${year} 进行创建。\033[0m"read -p "是否继续?(y/n): " choiceif [[ ! "$choice" =~ ^[Yy]$ ]]; then# 蓝色文字提示echo -e "\033[34m文件创建取消...\033[0m"returnfifi# 绿色文字echo -e "\033[32m⇓⇓⇓开始创建文件⇓⇓⇓\033[0m"# 睡眠1秒,显示文件创建的绿色文字sleep 1# 计算总的文件数量total_files=0for month in {01..12}; dototal_files=$((total_files + $(date -d "$month/01/$year +1 month -1 day" +%d)))done# 固定宽度进度条的宽度bar_width=50# 文件创建和进度条更新files_created=0for month in {01..12}; do# 计算指定的月份共有多少天,并从1号循环到月底for day in $(seq -w 01 $(date -d "$month/01/$year +1 month -1 day" +%d)); do# 批量创建文件touch ./${year}${month}${day}_GIME_PAY_HIST.csv.gz# 计算进度百分比files_created=$((files_created + 1))progress=$(( (files_created * 100) / total_files ))# 计算进度条的填充部分和空白部分filled_width=$(( (bar_width * progress) / 100 ))empty_width=$(( bar_width - filled_width ))# 输出固定宽度进度条printf "\r\033[33m进度: [%-${bar_width}s] %d%%\033[0m" "$(printf "%${filled_width}s" | tr ' ' '=')" "$progress"donedone# 换行以结束进度条行echo
}

2.2 效果

在这里插入图片描述

这篇关于Linux bash脚本 批量创建文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127872

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级