使用bash移动时如果重复则在文件名中添加字符

时间:2019-06-21 17:56:57

标签: bash duplicates mv

我目前使用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"

1 个答案:

答案 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视为成功,因此您无法测试结果以查看是否需要增加计数器。