Bash脚本迭代目录中的文件和模式匹配文件名

Hom*_*lli 26 bash ubuntu

我需要处理目录中的大量文件.可以根据文件名将文件分区为多个组.也就是说,文件名可以是模式匹配的,它们属于"组".例如,名称是这样的:

  • YYYYMMDD _*_ bulk_import.csv
  • YYYYMMDD _*_ genstats_import.csv
  • YYYYMMDD_*allstats.csv

等......

每个"组"具有不同的处理方法(即,要求处理不同的命令).

我想写一个bash脚本:

  1. 遍历目录中的所有CSV文件
  2. 通过将其名称与已知模式匹配的模式确定文件属于哪个"组"(如上面给出的示例)
  3. 根据确定的分组调用命令.

我在Ubuntu 10.0.4上运行.我是bash的新手,并希望能够帮助我开始编写这个脚本的骨架代码片段.

cdh*_*wie 48

最简单的方法可能就是分别迭代每个组.这方面完全解决了解析问题.

DIRECTORY=.

for i in $DIRECTORY/YYYYMMDD_*_bulk_import.csv; do
    # Process $i
done

for i in $DIRECTORY/YYYYMMDD_*_genstats_import.csv; do
    # Process $i
done

for i in $DIRECTORY/YYYYMMDD_*allstats.csv; do
    # Process $i
done
Run Code Online (Sandbox Code Playgroud)

设置DIRECTORY为您要搜索的目录.默认.将搜索当前工作目录.

  • 是否有一种简单的方法可以在循环中获得"*"的"值"? (6认同)
  • 当 $DIRECTORY 扩展为其中包含空格的内容时会发生什么? (2认同)

jaz*_*got 7

这是对文件的基本迭代,使用switch块来确定文件类型.

#!/bin/bash
for f in *; do
        case $f in 
                [0-9]*_bulk_import.csv)
                        echo $f case 1
                        ;;
                [0-9]*_genstats_import.csv)
                        echo $f case 2
                        ;;
                [0-9]*allstats.csv)
                        echo $f case 3
                        ;;
        esac
done
Run Code Online (Sandbox Code Playgroud)