Добавить символ к имени файла, если дублируется при перемещении с bash - PullRequest
0 голосов
/ 21 июня 2019

В настоящее время я использую скрипт 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 Ответ

2 голосов
/ 21 июня 2019

Используйте цикл, который проверяет, существует ли имя файла назначения, и увеличивает счетчик, если это так.Замените строку 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

Обратите внимание, что это страдает от проблемы TOCTTOU , если между тестом ! -f "$target" и mv создается дубликат файла,Я думал, что можно было бы заменить проверку существования с помощью mv -n;но хотя это и не перезаписывает файл, он все равно обрабатывает mv как успешный, поэтому вы не можете проверить результат, чтобы увидеть, нужно ли увеличивать счетчик.

...