Скрипт сохранения прежнего времени модификации после редактирования файла

/ Просмотров: 950

Префейс

Описание и код скрипта, сохраняющего прежнее время модифификации файла после его редактирования. Скрипт пригоден для текстовых и офисных форматов файлов, лишь бы они открывались в каком-либо редакторе.

Для чего

Бывает так, что в ворохе старых заметок, информационных, вспомогательных или справочных файлов обнаруживаются такие, которые требуют мелкого редактирования, например, исправления опечаток, добавления комментария или ссылки и т.п. Но при этом по какой-либо причине хочется сохранить так называемую отметку времени файла, т.е. то время, которое интуитивно (но неправильно) воспринимается нами как время создания файла, хотя файловые менеджеры честно указывают более точное название этого временнóго атрибута: например, Nemo именует его "Изменен", а MidnightCommander еще определеннее "Время правки".

В файловой системе ext4, как и в других журналируемых ФС, сохраняется целый ряд временны́х атрибутов файла. Кто хочет разобраться с ними в первом приближении, может прочитать, например, эту толковую заметку. Нам сейчас важно, что в файловых менеджерах отображается атрибут mtime (время модификации). Именно его мы и собираемся сохранить прежним после редактирования файла.

Как работает

С этой целью написан несложный скрипт. Работает он следующим образом:

  • запущенный без параметров — выводит краткую подсказку по своему назначению и использованию;
  • запущенный с именем файла в качестве параметра, запрашивает, в каком редакторе открыть файл, и после введения имени редактора (достаточно одной первой буквы, или двух — для таких программ как Libre Office или Komodo Edit) открывает файл в выбранном редакторе;
  • сидит курит, пока редактор не будет закрыт (первоначальный mtime файла сохраняется в переменной);
  • после закрытия редактора заменяет новый mtime на прежний и завершает работу.

Обратите внимание, что скрипт срабатывает по закрытию редактора, а не по сохранению файла (в чем легко убедиться, например, наблюдая за статусной строкой vim). Такое решение вызвано не только ленью автора, но и практическими соображениями: для столь мелкой цели вполне хватит рогатки вместо пушки.

Еще несколько мелких замечаний:

  • скрипт написан в (и для) Linux Mint 18, поэтому среди редакторов в нем присутствует xed, а не gedit. Если у вас как раз наоборот, то смотрите Note далее. Подобным же образом можно добавить свои редакторы (например, Kate) и/или убрать ненужные;
  • имя файла в аргументе следует заключать в кавычки (например, "/home/$USER/subdir/file"), если вы не уверены, что в имени файла или в пути к нему нет пробелов. Если пробелов нет — кавычки не обязательны.
  • в оригинале (для собственного пользования) автор щедро раскрасил вывод скрипта (см. скрины в конце), — видимо, сказалась близость Нового года. Но проблема в том, что раскраска вывода очень плохо переносима (у вас может быть совсем другая цветовая тема терминала, да и сам терминал другой), поэтому в основном варианте кода почти вся эта малярная деятельность убрана, за двумя исключениями, а "полноцветный" вариант приводится отдельно в конце поста.

Код скрипта

#!/bin/bash
# mtime_save.sh ver.01
# Скрипт сохранения прежнего времени модификации файла после его редактирования
stress=$(tput bold)
stop_=$(tput sgr0)
badex_=6999

if [[ -z "$1"  ]]; then
    echo "Скрипт для сохранения прежнего времени модификации файла после его редактирования"
    echo ${stress}"Применение:${stop_} "${0##*/}" \"/полное/имя/файла\""
    exit $badex_
    else
        if [[ -f "$1" ]]; then
echo "Введите имя редактора для файла \"${1##*/}\":
${stress}n${stop_}ano, ${stress}v${stop_}im, ${stress}x${stop_}ed или ${stress}lo${stop_} (LibreOffice):"

mtime_=$(stat -c %y "$1" 2>/dev/null)
            read edit
                case $edit in
n|nano) /bin/nano "$1"             ;;
v|vim) /usr/bin/vim "$1"           ;;
x|xed) /usr/bin/xed "$1"           ;;
lo)  /usr/bin/libreoffice "$1"     ;;
*) echo "Такого редактора не знаю..."        ;;
                esac
                    else
            echo "Файл \""$1"\" не найден"
            exit $badex_
        fi
fi
    wait
touch -d "${mtime_}" "$1"
exit 0

Note:

Если у вас Ubuntu или Linux Mint старше 18-го (то есть в вашей системе блокнотом служит не xed, а gedit), то замените кусочек кода

${stress}x${stop_}ed

на

${stress}g${stop_}edit

и строчку

x | xed) /usr/bin/xed "$1"           ;;

на

g | gedit) /usr/bin/gedit "$1"       ;;

Боевая раскраска

Под спойлером — "раскрашенный" вариант, которым пользуюсь сам. Он отличается лишь мелкими деталями: отсутствием редактора nano, который я терпеть не могу, добавлением Komodo Edit и разнообразной подсветкой вывода. Имейте в виду, что моя цветовая схема терминала — "зеленый на черном", а у вас, при другой палитре, белые строки могут вообще стать невидимыми.

Показать/спрятать код
#!/bin/bash
# ;;;;;;;;;;;;;;;;;; mtime_save.sh ver.02 ;;;;;;;;;;
# Скрипт сохраняет прежнее время модификации после редактирования файла
clr1="\e[1;31m"      # красный bold
clr2=$(tput setaf 220; tput setab 88)
clr3=$(tput setaf 11) # Желтый
clr4=$(tput setaf 15) # белый
end_=$(tput sgr0)
badex_=6999
# Если обьявить переменную $mtime_ здесь, то stat будет выдавать ошибку
#   +при отсутствии или неверном имени файла в аргументе скрипта
if [[ -z "$1"  ]]; then
    echo "$clr3""Скрипт для сохранения прежнего времени модификации файла после его редактирования""$end_"
    echo "$clr2""Применение:"$end_" "${0##*/}" \"/полное/имя/файла\""
    exit $badex_
    else
        if [[ -f "$1" ]]; then
echo "Введите имя редактора для файла "$clr4""${1##*/}"$end_"":
"$clr4"v"$end_"im, "$clr4"x"$end_"ed, "$clr4"lo"$end_" (LibreOffice) или "$clr4"ko"$end_" (KomodoEdit):"

mtime_=$(stat -c %y "$1" 2>/dev/null)
            read edit
                case $edit in
v|vim) /usr/bin/vim "$1"                                  ;;
x|xed) /usr/bin/xed "$1"                                  ;;
lo)  /usr/bin/libreoffice "$1"                            ;;
ko) /home/brego/Komodo-Edit-8/lib/mozilla/komodo "$1"     ;;
*) echo -e "$clr1""Такого редактора не знаю...""$end_"    ;;
                esac
                    else
            echo -e "$clr1""Файл "$end_""$clr4""$1""$end_" "$clr1"не найден""$end_"
            exit $badex_
        fi
fi
    wait
touch -d "${mtime_}" "$1" 
exit 0

Как это выглядит

При запуске без параметров вывод скрипта выглядит так:

Вывод без параметров

Если файл не найден, скрипт об этом так прямо и говорит:

Ошибка в имени файла

Если файл существует, предлагается выбрать для него редактор (достаточно ввести только подсвеченные буквы):

Выбор редактора

Если имя редактора ввведено с ошибкой, скрипт ругается:

Ошибка в имени редактора
Оставьте комментарий

Комментарий будет опубликован после проверки

(обязательно)