我目前使用bash脚本和PDFgrep将文件重命名为特定结构。但是,如果新文件名重复,为了停止覆盖,我想在名称末尾添加一个数字。请记住,可能有3或4个重复的名称。最好的方法是什么?
#!/bin/bash
if [ $# -ne 1 ]; then
echo Usage: Renamer file
exit 1
fi
f="$1"
id1=$(pdfgrep -m 1 -i "MR# : " "$f" | grep -oE "[M][0-9][0-9]+") || continue
id2=$(pdfgrep -m 1 -i "Visit#" "$f" | grep -oE "[V][0-9][0-9]+") || continue
{ read today; read dob; read dop; } < <(pdfgrep -i " " "$f" | grep -oE "[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]")
dobsi=$(echo $dob | sed -e 's/\//-/g')
dopsi=$(echo $dop | sed -e 's/\//-/g')
mv -- "$f" "${id1}_${id2}_$(printf "$dobsi")_$(printf "$dopsi")_1.pdf"
答案 0 :(得分:2)
使用一个循环检查目标文件名是否存在,如果存在则增加一个计数器。将mv
行替换为此:
prefix="${id1}_{id2}_${dob}_${dop}"
counter=0
while true
do
if [ "$counter" -ne 0 ]
then target="${prefix}_${counter}.pdf"
else target="${prefix}.pdf"
fi
if [ ! -e "$target" ]
then
mv -- "$f" "$target"
break
fi
((counter++))
done
请注意,如果在! -f "$target"
测试和mv
之间创建了重复文件,则会遇到TOCTTOU问题。我认为可以使用mv -n
替换存在检查;但是虽然这不会覆盖文件,但仍将mv
视为成功,因此您无法测试结果以查看是否需要增加计数器。