Linux 命令行/bash脚本 批量创建文件


一. 命令行

1.1 需求

  • 在当目录下生成指定年份的文件,要求从生成1月到12月,每个月份的文件。
  • 每个月的天数不一样
  • 2月份可能存在闰年

1.2 代码

  • {01..12}:扩展成一个连续序列,1到12
# 创建2023年到2024年1月到12月的1号到31号所有的文件
touch ./{2023..2024}{01..12}{01..31}_PAY_INFO_MSG.csv

# 2,4,6,9,11月份没有31号,删除不符合规则的文件
rm ./*{0{2,4,6,9},11}31_PAY_INFO_MSG.csv
# 2月不可能有30号,为提高可读性,单独删除
rm ./*0230_PAY_INFO_MSG.csv

# 2023年不是闰年,2月份不可能有29天,为提高可读性,单独删除
rm ./20230229_PAY_INFO_MSG.csv

⏹⇓⇓⇓效果如下⇓⇓⇓

fegyehong@apluser MINGW64 ~/Desktop/
-rw-r--r-- 1 fegyehong 197609 0  93 07:54 20230101_PAY_INFO_MSG.csv
-rw-r--r-- 1 fegyehong 197609 0  93 07:54 20230102_PAY_INFO_MSG.csv
-rw-r--r-- 1 fegyehong 197609 0  93 07:54 20230103_PAY_INFO_MSG.csv
-rw-r--r-- 1 fegyehong 197609 0  93 07:54 20230104_PAY_INFO_MSG.csv
-rw-r--r-- 1 fegyehong 197609 0  93 07:54 20230105_PAY_INFO_MSG.csv
-rw-r--r-- 1 fegyehong 197609 0  93 07:54 20230106_PAY_INFO_MSG.csv
-rw-r--r-- 1 fegyehong 197609 0  93 07:54 20230107_PAY_INFO_MSG.csv

...... 省略 ......

二. bash脚本

2.1 需求

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

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

2.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来重置颜色回到默认值。
    如果不重置颜色回到默认值的话,整个控制台的颜色都会受到影响。

2.3 无进度条版本

2.3.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 ...

2.3.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): " choice
	
    if [[ ! "$choice" =~ ^[Yy]$ ]]; then
	  # 蓝色文字提示
      echo -e "\033[34m文件创建取消...\033[0m"
      return
    fi
	
  fi

  # 绿色文字
  echo -e "\033[32m⇓⇓⇓开始创建文件⇓⇓⇓\033[0m"
  # 睡眠1秒,显示文件创建的绿色文字
  sleep 1

  # 循环1月到12月,批量创建文件 
  for month in {01..12}; do
    for 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.gz
    done
  done
}

2.3.3 效果

在这里插入图片描述


2.4 有进度条版本

2.4.1 代码

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): " choice
    
    if [[ ! "$choice" =~ ^[Yy]$ ]]; then
      # 蓝色文字提示
      echo -e "\033[34m文件创建取消...\033[0m"
      return
    fi
  fi

  # 绿色文字
  echo -e "\033[32m⇓⇓⇓开始创建文件⇓⇓⇓\033[0m"
  # 睡眠1秒,显示文件创建的绿色文字
  sleep 1

  # 计算总的文件数量
  total_files=0
  for month in {01..12}; do
    total_files=$((total_files + $(date -d "$month/01/$year +1 month -1 day" +%d)))
  done

  # 固定宽度进度条的宽度
  bar_width=50
  # 文件创建和进度条更新
  files_created=0
  
  for 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"
    done
    
  done
  
  # 换行以结束进度条行
  echo
}

2.4.2 效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值