Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于迭代目录中的文件并匹配文件名的Bash脚本_Bash_Ubuntu - Fatal编程技术网

用于迭代目录中的文件并匹配文件名的Bash脚本

用于迭代目录中的文件并匹配文件名的Bash脚本,bash,ubuntu,Bash,Ubuntu,我需要处理目录中的大量文件。根据文件名,可以将文件划分为多个组。也就是说,文件名可以与它们所属的“组”进行模式匹配。例如,名称如下: YYYYMMDD_*\u bulk\u import.csv YYYYMMDD_*_genstats_import.csv YYYYMMDD_*allstats.csv 等等 每个“组”都有不同的处理方法(即调用不同的命令进行处理) 我想写一个bash脚本: 遍历目录中的所有CSV文件 通过将文件名与已知模式进行模式匹配来确定文件属于哪个“组”(如我上面给出的

我需要处理目录中的大量文件。根据文件名,可以将文件划分为多个组。也就是说,文件名可以与它们所属的“组”进行模式匹配。例如,名称如下:

  • YYYYMMDD_*\u bulk\u import.csv
  • YYYYMMDD_*_genstats_import.csv
  • YYYYMMDD_*allstats.csv
等等

每个“组”都有不同的处理方法(即调用不同的命令进行处理)

我想写一个bash脚本:

  • 遍历目录中的所有CSV文件
  • 通过将文件名与已知模式进行模式匹配来确定文件属于哪个“组”(如我上面给出的示例)
  • 根据确定的分组调用命令

  • 我在Ubuntu 10.0.4上运行。我是bash新手,希望能有一个框架代码片段帮助我开始编写这个脚本。

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

    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
    

    目录设置为要搜索的任何目录。默认的
    将搜索当前工作目录。

    这里是对文件的基本迭代,使用开关块确定文件类型

    #!/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
    

    有没有一种简单的方法可以在循环中获取
    *
    的“值”呢?这种方法可以循环使用吗?我是BASH的新手,但我认为可以使用
    tmp=${I#*.};value=${tmp%\u bulk\u import.csv}
    ,对于其他组也是如此。我是基于这一点,我已经在我的文件上尝试过了。