Automator :: Удалить 6-значную дату из имени файла; добавить текущую дату


3

Я заранее прошу прощения, если на этот вопрос был дан ответ, но я провел длительный поиск в надежде на решение.

У меня есть работающее приложение Automator, которое добавляет текущую шестизначную дату (ГГММДД) в конец имени файла:

  • Вход: Filename.txt
  • Вывод: имя_файла_181212.txt

Текущая команда bash:

today=$(date +%y%m%d)
for f in "$@"
do
    basename=${f##*/}
    filename=${basename%.*}
    path=${f%/*}
    ext=${f##*.}
    newfilename="$filename"_"$today"
    mv "$f" "$path"/"$newfilename"."$ext"
done

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

Там два сценария:

  1. Имя файла содержит любую дату (предыдущую / текущую / будущую) в 6-значном формате, описанном ранее, с предшествующим подчеркиванием (Filename_181212.txt).
  2. Имя файла не содержит добавленного к нему 6-значного формата даты (Filename.txt)

Я понимаю, что решение, на которое я надеюсь, удалит любые шесть цифр и предшествующее ему «_», если оно существует, независимо от того, является ли оно датой или нет.

Возможно ли предварять мою текущую команду bash чем-то вроде:

если какая-либо комбинация чисел существует непосредственно перед расширением файла (".ext") и содержит ровно 6 цифр, а перед символом подчеркивания ("_")

затем удалите подчеркивание плюс 6 цифр и выполните команду bash, указанную выше

если нет, то запустите команду bash выше

Резюме Я пытаюсь облегчить удаление вручную дат, которые могут существовать в имени файла, перед добавлением к ним текущей даты. Некоторые файлы могут иметь даты, а другие - нет.


Да, но похоже, что в этом случае команда date не имеет значения, потому что нужно найти только 6 цифр (плюс предшествующее подчеркивание) независимо от того, является ли это прошлой, предыдущей или будущей датой.
Джереми W

извините, я удалил свой комментарий, понимая, что это глупо.
Рускес

Дата в имени файла - это не Дата, а просто текст (цифры), но мы видим ее как дату. Так что, если вы удалите все числа в имени файла, это будет работать?
Рускес

Я верю в это, но «_» также необходимо удалить, потому что оно будет добавлено при добавлении текущей даты. Напоминаем, что если дата не существует, то ничего не удаляется; это просто передается команде, которая добавляет дату (которая у меня есть в настоящее время).
Джереми W

это довольно хирургический процесс, о котором вы просите. И просто удалить имя файла и заменить, если с датой не вариант для вас.
Рускес

Ответы:


2

Это должно сделать, как вы просили:

#!/bin/bash

today=$(date +%y%m%d)

for f in "$@"; do

    filebasename=${f##*/}
    filename=${filebasename%.*}
    path=${f%/*}
    ext=${f##*.}

    if [[ "$filename" =~ ^.*_[0-9]{6}$ ]]; then

        filename="$(sed -E -e 's/_[0-9]{6}$//'<<<"$filename")"

        newfilename="$filename"_"$today"
        mv "$f" "$path"/"$newfilename"."$ext"   

    else    

        newfilename="$filename"_"$today"
        mv "$f" "$path"/"$newfilename"."$ext"

    fi

done

Обратите внимание , что при использовании в Run Shell Script действия в качестве Automator рабочего процесса , возможно , потребуется добавить полный путь к sedв коде при условии, например:/usr/bin/sed


Хорошо. Для ясности, если я изменю переменную «basename» (и ее ссылку в переменной «filename») на что-то вроде «filebasename», тогда не должно быть конфликта, если он используется непосредственно в терминале или командной строке?
Джереми W

@ Джереми W, Да, это хорошая замена на любое другое имя, кроме существующего имени команды, «filebasename» - это нормально, или что-то другое, а не просто «baesname» в этом случае использования. Я оставил его таким, каким вы его изначально написали, чтобы вам было легче видеть, какой код я добавил в ваш существующий код. Я обновлю это в своем ответе теперь, я знаю, что вы знаете об этом. Также смотрите обновленную заметку.
user3439894
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.