Как создать каталог из нескольких частей имени файла - PullRequest
1 голос
/ 31 мая 2019

Недавно мы экспортировали записи о пациентах из нашей старой системы EMR, проблема заключается в том, что каждая заметка для каждого пациента выдается в виде отдельного файла PDF, в результате чего в одном каталоге содержится более 876 000 документов PDF, все с длинным, громоздким форматом имени файла ID #-record # .YYYY-MM-DD HH.MM.SS.FIRSTNAME LASTNAME.TYPE of NOTE.pdf

Моя первая цель - получить все файлы в каталогах пациентов, помеченных идентификатором # FIRSTNAME LASTNAME

то есть: для файла, помеченного

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 Ответ

1 голос
/ 31 мая 2019

Вы можете использовать регулярное выражение , например:

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. Это очень удобно для извлечения информации из форматированных строк.

Обратите внимание, что при этом файлы будут эффективно группироваться по их идентификатору / имени, а не только по идентификатору. Это означает, что если у вас есть файлы с одинаковым идентификатором, но с другим именем, они будут помещены в разные подкаталоги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...