如何从文件名的多个部分创建目录

时间:2019-05-31 16:41:48

标签: bash

我们最近从旧的EMR系统中导出了患者记录,麻烦的是每位患者的每条便笺都出来了,因为它是自己的PDF文件,在一个目录中产生了876,000+个PDF,且文件名格式冗长且笨拙,ID ## -record#.YYYY-MM-DD HH.MM.SS.FIRSTNAME LASTNAME.TYPE OF NOTE.pdf

我的首要目标是将所有文件放入带有ID#FIRSTNAME LASTNAME标签的患者目录中

ie:对于标记为

的文件
345-1.2011-02-3 08.59.53.JOHN DOE.General Miscellaneous Service.pdf 

将创建一个名为345-JOHN DOE的目录,并将所有以345开头的文件放入其中。

我知道我可以使用类似的脚本

for file in ./*_???ILN*; do
    dir=${file%ILN*}
    dir=${dir##*_}
    mkdir -p "./$dir" &&
    mv -iv "$file" "./$dir"
done

在此示例中,它将采用_和ILN之间的值,并仅在该值上创建目录。但是,如何在可能的情况下如何使用ID#值和FIRSTNAME LASTNAME值创建目录?

1 个答案:

答案 0 :(得分:1)

您可以use a regex像这样:

for i in *.pdf; do
    if [[ "$i" =~ ^([0-9]+)-[0-9]+\.[0-9]{4}-[0-9]{2}-[0-9]{1,2}\ [0-9]{2}\.[0-9]{2}\.[0-9]{2}\.([^.]+)\. ]]; then
        id="${BASH_REMATCH[1]}"
        name="${BASH_REMATCH[2]}"
        subdir="$id-$name"
        mkdir -p -- "$subdir"
        mv -- "$i" "$subdir"
    else
        echo "couldn't parse file name: $i" >&2
    fi
done

Bash(版本3起)在=~中支持[[ ]](正则表达式匹配)运算符,该运算符将( )组捕获的子字符串放入BASH_REMATCH数组中。这对于从格式化的字符串中提取信息非常方便。

请注意,这将有效地按文件的ID /名称组合对文件进行分组,而不仅仅是ID。这意味着,如果您拥有具有相同ID但名称不同的文件,它们将被放置在不同的子目录中。