我们最近从旧的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值创建目录?
答案 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但名称不同的文件,它们将被放置在不同的子目录中。