uk
Feedback
Bash Days | Linux | DevOps

Bash Days | Linux | DevOps

Відкрити в Telegram

Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru

Показати більше

📈 Аналітичний огляд Telegram-каналу Bash Days | Linux | DevOps

Канал Bash Days | Linux | DevOps (@bashdays) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 23 788 підписників, посідаючи 5 701 місце в категорії Технології та додатки та 28 125 місце у регіоні Росія.

📊 Показники аудиторії та динаміка

З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 23 788 підписників.

За останніми даними від 18 червня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -216, а за останні 24 години на -5, загальне охоплення залишається високим.

  • Статус верифікації: Не верифікований
  • Рівень залученості (ER): Середній показник залученості аудиторії становить 22.75%. Протягом перших 24 годин після публікації контент зазвичай збирає 12.90% реакцій від загальної кількості підписників.
  • Охоплення публікацій: В середньому кожен допис отримує 5 413 переглядів. Протягом першої доби публікація в середньому набирає 3 068 переглядів.
  • Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 21.
  • Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як bashdays, linux, bash, docker, скрипт.

📝 Опис та контентна політика

Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.r...

Завдяки високій частоті оновлень (останні дані отримано 19 червня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.

23 788
Підписники
-524 години
-257 днів
-21630 день
Архів дописів
🔥 Открытые консультации по Kubernetes от архитекторов Southbridge Лекций по кубу в интернете много, а желающих потратить вре
🔥 Открытые консультации по Kubernetes от архитекторов Southbridge Лекций по кубу в интернете много, а желающих потратить время и разобрать ваши вопросы — мало. Мы решили это исправить! Southbridge — DevOps-аутсорсер, специализирующийся на k8s. Cреди экспертов — Сергей Бондарев, один из создателей флагманских курсов по Kubernetes учебного центра Слёрм. Первая консультация пройдёт 4 июля в 17:00. Сергей и его коллеги в прямом эфире будут отвечать на все ваши вопросы и делиться best practices по эксплуатации кубов. Для участия в консультациях мы собрали бота-помощника. В нём есть кнопка «Задать вопрос» — спросите у нас что-нибудь нужное! Без ваших вопросов ничего не случится. Так что спрашивайте и занимайте место на нашей встрече. Это бесплатно. 🙃 Ждём вас 4 июля! 🔗 ЗАДАТЬ ВОПРОС И ПРИЙТИ НА КОНСУЛЬТАЦИЮ Реклама ООО «Слёрм» ИНН 3652901451 erid: 2VtzqwQCwAg

Отличный способ запихать все свои crontab джобы в git репозиторий и раскатывать по желанию на сервера. Подойдет для хейтеров всяких ансамблей, паппетов и других бродячих цирков абсурда.
По мотивам этого поста про факап с кронами и его восстановление через grep.
Короче создаешь репу в гите, создаешь текстовый файл supercron. И в этот файл переносишь все свои действующие джобы. Коммит && Пуш --форцед инда мастер оф паппетс. Ну а дальше элементарно. Накидываем чото подобное:
#!bin/bash

REPO_DIR=/tmp
CRON_FILE=/tmp/supercron
cd $REPO_DIR
git pull origin master
crontab $CRON_FILE
Суть — забрать из репы файл supercron и импортировать жопы джобы. Импорт осуществляется последней строкой crontab /tmp/supercron. Сразу предупрежу, твой /var/spool/cron/crontab/root перетрется без предупреждения содержимым файла supercron. Можешь этот скрипт повесить на крон и сервер «даст ёбу». Крон, который импортирует крон. 💃 Идеальная рекурсия. Ну и соответственно, если кто-то кроме тебя работает с сервером, все правки в кроне — теперь только через гит репу. А это уже мастхев, всегда будешь видеть, кто нахуевертил. Короче ништяк костыль. Инфраструктура как кот! Не благодари ) tags: #devops #bash — 🔔 @bashdays

🔆 Приглашаем вас на вебинар "Знакомство с MySQL InnoDB Cluster"! 🚀 🧠 Мы разберём все отличия кластерного решения InnoDB Cl
🔆 Приглашаем вас на вебинар "Знакомство с MySQL InnoDB Cluster"! 🚀 🧠 Мы разберём все отличия кластерного решения InnoDB Cluster от обычной репликации. Вы узнаете, как настроить и запустить рабочий кластер, получите полное представление о возможностях и ограничениях этого решения. 👍 Наш вебинар станет находкой для системных администраторов Linux, администраторов баз данных (DBA) и всех, кто хочет познакомиться с InnoDB Cluster. Вебинар откроет новые горизонты в администрировании баз данных, позволив понять основные различия архитектуры кластера и традиционной репликации. 🏆 Спикер Николай Лавлинский — технический директор в Метод Лаб, PhD Economic Science, опытный руководитель разработки и преподаватель. ⏰ Занятие пройдёт 04 июля 2024 года в 19:00 по мск в рамках курса «Инфраструктура высоконагруженных систем». Доступна рассрочка на обучение! 👉 Зарегистрируйтесь для участия https://vk.cc/cxYXWx Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Сегодня будем искать самое длинное слово в текстовом файле. На pure bash. Зачем? Джаст фор фан, чтоб мозги подразмять. А вообще эта задачка из методички для собесов. Создаем текстовый файл bashdays.txt с таким содержимым:
hello world хуйпиздаджигурда bashdays комутохеровато бидон
Пишем скрипт:
#!/bin/bash

longest=0
for word in $(<bashdays.txt)
do
    len=${#word}
    if (( len > longest ))
    then
        longest=$len
        longword=$word
    fi
done
printf 'Самое длинное слово %s и его длина %d.\n' "$longword" "$longest"
В результате получаем: Самое длинное слово «хуйпиздаджигурда» и его длина 16. Алгоритм таков: цикл проходит по каждому слову в файле, вычисляет длину текущего слова len=${#word} и сохраняет результат в переменную len. Ну и логика больше-меньше. Если знаешь способ короче, без использования внешних утилит, кидай в комменты, полайкаем. Вечером еще чтиво подъедет. На связи! tags: #bash — 🔔 @bashdays

Разыгрывать будем 👆 только среди подписчиков могзотрах, чатика и полезняшек, королевство кривые ебал — мимо

Сегодня подъехал экземпляр «Релиз», Лемитед блядь эдищен. Если моя ленивая жопа завтра соизволит сходить на почту, то завтра
+3
Сегодня подъехал экземпляр «Релиз», Лемитед блядь эдищен. Если моя ленивая жопа завтра соизволит сходить на почту, то завтра и разыграем эту колоду среди подписчиков нашего Пантеона.

а у кого какие бест практики подобных деплоев? 👆 давайте в комментах найдем эти практики, будет всем полезно, чтоб гавно не делать впредь

Со шрамами приходит сила И снова здрасти. Хуй знает очевидная эта штука для тебя или нет, но я все равно ее подсвечу. Предположим у тебя есть какой-то проект описанный в docker-compose.yml. Вся эта чача раскатывается через пайплайны gitlab на продакшен. Из того что я постоянно вижу — После сборки проекта, все собранные файлы копируются на продакшен с помощью rsync, scp или подобных утилит, ну и ранится все это дело через ssh. Например:
script 
 - билд хуилд
 - rsync -avz --delete ./ user@$prod:/var/www`
 - ssh user@$prod "docker compose up -d"
1. Что-то там собралось 2. Файлы синканулись с продом 3. Запустилось если смогло ✔ Хуита! Всё делается изящнее. Ща покажу.
stage: deploy
image:
  name: docker/compose
  script:
    - docker-compose -H "ssh://root@$prod" down --remove-orphans
    - docker-compose -H "ssh://root@$prod" pull
    - docker-compose -H "ssh://root@$prod" up -d
Используем мощности docker-compose, не привлекаем никакие rsync, scp и т.п. А сразу нативно запускаем на проде наш docker-compose.yml файл. Никаких лишних файлов не копируется, никаких утилит, минималистичное. Я примеры сократил, но суть ты поймешь. Не обязательно тащить на прод какие-то ямеэльки. В штыки не воспринимай, способ с rsync и т.п. вполне годный. Но делюсь, тем, чем пользуюсь сам. У меня телеграм боты так деплоятся. Изучай. Не отвлекаю! Если хоть одному из вас пригодится, это уже хорошо! tags: #devops — 🔔 @bashdays

Ну и пекло, по ощущениям +60 и комары. Сегодня на изи, KPI нулевой. Узнаем имя и путь последнего файла/каталога. Иногда нужно отработать подобный кейс, чтобы произвести какие-то манипуляции над последним файлом в каталоге.
ls -t ~/backups/* | head -1
Выдаст полный путь до файла/каталога. В примере папка с бекапами. Чтобы не ебстись и городить кишку с find, у ls есть для этого ключик для сортировки. Ну и с помощью head, забираем имя последнего файла/каталога. Всё, пойду дальше плавиться… tags: #bash #linux — 🔔 @bashdays

🗓 27 июня, 16:00 📌 Как быстро мигрировать инфраструктуру в Selectel На бесплатном вебинаре от @Selectel коллеги расскажут,
🗓 27 июня, 16:00 📌 Как быстро мигрировать инфраструктуру в Selectel На бесплатном вебинаре от @Selectel коллеги расскажут, как перенести инфраструктуру с минимальным даунтаймом и при этом предусмотреть все нюансы миграции. Сколько времени занимает переезд проекта, с какими проблемами можно столкнуться и как убедиться, что после миграции ничего не сломалось. Основные темы: ◽️ План переноса. ◽️ Потенциальные проблемы. ◽️ Инструменты для миграции. ◽️ Тестирование сервисов. Все участники смогут принять участие в акции «100% скидка на облачные ресурсы на 1 месяц» и получат типовой план переноса инфраструктуры. Регистрируйтесь на мероприятие и участвуйте в розыгрыше приза за лучший вопрос: https://slc.tl/rkovh Реклама ООО «Селектел» erid: 2VtzquiyU5m

Забавная хуита. Виндовз что с тобой? Короче если создать текстовый файл с содержимым «This content is no longer available.» и
Забавная хуита. Виндовз что с тобой? Короче если создать текстовый файл с содержимым «This content is no longer available.» и сохранить его, винда начинает жестко угорать. Мол, вы пиздец хакер и только что создали вирус под названием Trojan:Win32/Casdet!rfn. Касдет-пиздет.
Trojan:Win32/Casdet!rfn – это вредоносная программа, относящаяся к категории удаленного доступа (RAT). Она позволяет злоумышленникам получить контроль над вашим компьютером, красть ваши данные и устанавливать другие вредоносные программы.
Прикольно. Что-то из оперы EICAR
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
По-видимому, это коллизия хэшей. Потому что только Windows Defender его детектит, вот репорт с вирус-тотал. tags: #мозготрах — 🔔 @bashdays

Зрасти. Сегодня замутим простую проверку корректности формата файла. Для этого воспользуемся утилитой sed. Вводные Есть файл с последовательностью символов 1, 2, 3, 4, 5. Каждая цифра с новой строки. Эти символы могут располагаться в любой позиции строки. Строка может содержать другие символы отличные от символов заданной последовательности. Пример такого файла:
1  
2  
3  
4 
a1  
b2  
3c  
4d
Теперь нужно, чтобы при проверке такого файла, программа прерывалась и выводила номер строки, которая нарушает формат. Если файл содержит допустимую последовательность или пустой, то — молчим. Создаем скрипт check
#!/usr/bin/sed -nf

$bE ; /1/!bE ; n  
$bE ; /2/!bE ; n  
$bE ; /3/!bE ; n  
/4/b

:E = ; q
Необычно? Необычно! Это скрипт на языке Sed. Давай Разберем, что тут происходит. $bE = Если находимся на последней строке переход к метке «E». /1/!bE ; n = Если текущая строка не содержит 1, переход к метке «E». В противном случае переходим к следующей строке. … аналогично для 2 и 3 /4/b = Если текущая строка содержит 4, перейти в конец скрипта. :E = ; q = метка «E» печатает текущую строку и завершает выполнение. Погнали чекать кейсы. Не забудь на check впиздярить +x.
printf '%s\n' {1..3} | ./check
printf '%s\n' {1..4} | ./check 
printf '%s\n' {1..4} {1..5} | ./check
printf '%s\n' {1..4} {1..4} | ./check 
printf '%s\n' a{1..4} b{1..4} | ./check  
printf '%s\n' a{1..4} b{1..3} | ./check
1. Выводится 3 номер строки 2. Пусто. Файл валиден. 3. Выводится 9 номер строки 4. Пусто. Файл валиден. 5. Пусто. Файл валиден. 6. Выводится 7 номер строки
Вместо перехода на метку можно просто выходить и возвращать нужное значение с помощью команды «q» которая в GNU версии принимает аргумент.
Чтиво: адресация, команды, шаблоны tags: #bash #linux — 🔔 @bashdays

Здравствуйте товарищи. Ну чо, как оно? Поехали еBash’ить. Сегодня разберем интересную задачку, которую я подкидываю на собесы. Задача со звездочкой. Суть задачи: нужно вывести строки в окно терминала и пронумеровать их используя только один вызов sed. Аналогично выводу команды nl. То есть должно получиться такое:
printf '%s\n' {a..d} | nl
1 a
2 b
3 c
4 d
Только это нужно сделать с помощью одного вызова sed. Обычно кто берется ее решать, спустя какое-то время говорят — Роман, иди нахуй, это сделать невозможно! Так говорят бедолаги, которым либо лень что-то делать, либо писька еще не отросла. Всё возможно, было бы желание. Короче поехали решать. Давай попробуем сразу с sed несколько вариантов.
printf '%s\n' {a..d} | sed '='  
printf '%s\n' {a..d} | sed -n 'p;='  
printf '%s\n' {a..d} | sed -n '=;p'
Ну чет да… ожидаемый результат совсем не ожидаемый. Дело в том, что когда sed встречает команду «=», он тут же пишет текущий номер строки с завершающим символом «\n» или «\0». То есть номер и строка разделены «\n» или «\0». Поэтому в примерах по sed для решения этой задачи, используют два вызова.
printf '%s\n' {a..d} | sed '=' | sed 'N;s/\n/ /'
Вот так всё корректно отработает, но задачу мы не решили, условия другие. Нам можно использовать лишь один sed. ✔ Чо будем делать? Думать ёпта! Для начала надо посмотреть, а что мы имеем и на что можем повлиять. Утилита sed пишет строки. Куда она их пишет? Вот и решение… Вставляем в начало каждой строки, управляющую последовательность. Которая переместит курсор на предыдущую строку и установит его например в 3 колонку.
printf '%s\n' {a..d} | sed '=;s/^/\x1b[1A\x1b[3G/'
Получаем ожидаемый результат:
1 a
2 b
3 c
4 d
Поздравляю! Задача решена с помощью всего лишь одного вызова sed.
Если очевидные решения не приносят результата, всегда можно воспользоваться неочевидными. Благо таких неочевидных решений бесконечное множество.
Изучай. Всех с пятницей и хороших предстоящих выходных. Береги себя! tags: #bash #linux — 🔔 @bashdays

Не переношу жару, черт его знает как в детстве мы сидели во дворе и пили водку на солнце в +45 градусов, сейчас бы я так не смог. Сегодня будем проводить ректальное тестировать переменной PATH с помощью кишки.
( set -f; IFS=':'; for i in ${PATH:?'хуй с маслом'};do [[ -r "$i" && -d "$i/." ]] || echo "$i";done )
Эта кишка проверяет элементы в переменной PATH. И выводит на экран которые не существуют, или к которым нет доступа на чтение. Давай разберем каждый элемент отдельно:
set -f
Отключает функцию pathname expansion (или globbing). Это предотвращает интерпретацию символов *, ? и [] как шаблонов имен файлов.
IFS=':'
Устанавливает разделитель полей (Internal Field Separator, IFS) на двоеточие «:». Это необходимо для правильного разбора переменной PATH, где пути разделены двоеточием.
for i in ${PATH:?'хуй с маслом'}
Запускает цикл for, который перебирает каждый элемент переменной PATH. Выражение ${PATH:?'empty path'} проверяет, что переменная PATH не пустая; если она пустая, выводится сообщение «хуй с маслом» и выполнение прерывается.
do [[ -r "$i" && -d "$i/." ]] || echo "$i"; done
Внутри цикла проверяется каждый элемент «i» из PATH.
[[ -r "$i" && -d "$i/." ]]
Проверяет, существует ли каталог (-d "$i/.") и доступен ли он для чтения (-r "$i").
|| echo "$i"
Если каталог не существует или недоступен для чтения, то выводится значение «i» (путь). Думаю более менее понятно. Если видишь огромную кишку, разбивай её на части и тогда с ней проще будет разобраться.
Это как в тайм-менеджмент, что-то там блядь про делёжку слона на маленькие кусочки.
В общем суть такая — если переменная PATH не установлена или пустая, команда завершится и будет выдано сообщение «хуй с маслом». Поля переменной PATH отображаются на экран, если не соответствуют минимальным требованиям, или являются нулевыми. Bash будет искать в текущей директории.
man bash → PARAMETERS → Shell Variables → PATH PATH The search path for commands.  It is a colon-separated list of directories in which the shell looks for commands (see COMMAND EXECUTION below).  A zero-length (null) directory name in the value of PATH indicates the current directory.  A null directory name may appear as two adjacent colons, or as an initial or trailing colon.  The default path is  system-dependent,  and is set by the administrator who installs bash.  A common value is `/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin'
Минимальные требования. Каждый элемент пути должен иметь бит исполнения. Последний элемент должен быть каталогом и обладать разрешением на чтение, исполнение. Для запуска программы достаточно, чтоб исполняемый файл программы имел бит исполнения и все каталоги в пути имели бит исполнения, чтения (не требуется если указываете полный путь до исполняемого файла). У меня например после запуска кишки, выдало:
/snap/bin
Пошел смотреть и точно, в переменной PATH этот каталог указан, а физически его нет на диске. Для исследования путей удобно использовать команду namei.
namei -m /etc

f: /etc
   drwxr-xr-x /
   drwxr-xr-x etc
Тему про PATH поднимал раннее в этом посте.
Ну а так вроде всё, изучай! tags: #bash #linux — 🔔 @bashdays

🗓 20 июня , 18:00 📌 Selectel Network MeetUp№10. Юбилейный, терапевтический. Коллеги из @Selectel приглашают на свой десятый
🗓 20 июня , 18:00 📌 Selectel Network MeetUp№10. Юбилейный, терапевтический. Коллеги из @Selectel приглашают на свой десятый митап, где поднимут наболевшие темы. Обсудят работу с дешевыми и дорогими коммутаторами, организацию Wi-Fi в компании и способы защиты от сетевых атак. Основные темы: ▫️ Защита от SYN-flood. ▫️ Работа с коммутаторами. ▫️ Опыт работы и заблуждения о Wi-Fi. Будет полезно всем, кто работает с сетями и сетевым оборудованием, а особенно сетевым администраторам, инженерам и архитекторам. Участие бесплатное, регистрируйтесь по ссылке и приходите в офис в Санкт-Петербурге или подключайтесь онлайн: https://slc.tl/fl4u4 Реклама ООО «Селектел» erid: 2VtzqvVQzhd

Если угораешь по оффлайн утилитам и швейцарским ножам, то эта мастхэвная штука как раз для тебя. Называется DevToys. Работает
Если угораешь по оффлайн утилитам и швейцарским ножам, то эта мастхэвная штука как раз для тебя. Называется DevToys. Работает под всеми операционками, натыкиваешь мышкой, получаешь результат. Есть даж портативная версия, чтобы не засирать систему мусором. DevToys включает в себя более 30 полезных утилит. Я обычно в онлайне подобными штуками пользуюсь, типа там json проверить, сконвертировать или наглядно кронтаб соорудить. Эта тулза прям зашла именно как оффлайн. В моей тайге не всегда есть интернет и онлайн сервисы теряют свою актуальность, а работать как-то надо. Кстати кто презирает гуёвость, есть и cli версия. А еще можно свои модули написать и расширять функционал до бесконечности. Короче полный фарш. Советую потыкать. Качнуть с гитхаба ➡️ DevToys И еще есть в официальном Microsoft Store, тыкнул Download и она у тебя. Состав, тыкай на спойлер
- Converters | - JSON <> YAML | - Timestamp | - Number Base | - CRON Parser - Encoders / Decoders | - JWT | - HTML | - URL | - Base64 Text & Image | - GZip - Formatters | - JSON | - SQL | - XML - Generators | - Hash (MD5, SHA1, SHA256, SHA512) | - UUID 1 and 4 | - Lorem Ipsum | - Checksum - Text | - Inspector & Case Converter | - Regex Tester | - Text Comparer | - XML Validator | - Markdown Preview - Graphic | - Color Blindness Simulator | - Color Picker & Contrast | - PNG / JPEG Compressor | - Image Converter ... and more are coming!
tags: #utilites — 🔔 @bashdays

📺 Пятый эпизод реалити «PT NGFW за стеклом» |19 июня в 14:00| Продолжаем рассказывать про разработку самого производительног
📺 Пятый эпизод реалити «PT NGFW за стеклом» |19 июня в 14:00| Продолжаем рассказывать про разработку самого производительного NGFW на российском рынке. В этот раз расскажем про движок IPS. Алексей Дядин, руководитель разработки ядра PT NGFW: 📍 Развеет мифы об IPS-модуле 📍 Поделится визионерским взглядом на привычную технологию 📍 Расскажет, почему наш PT IPS выжимает более 60 Гбит/c По традиции, участники трансляции смогут влиять на развитие PT NGFW, задавая спикерам каверзные вопросы. 👉 Зарегистрироваться

Сегодня без прелюдий. Давай через утилиту ps узнаем время, когда был запущен процесс. Делается это довольно просто. Для начал
Сегодня без прелюдий. Давай через утилиту ps узнаем время, когда был запущен процесс. Делается это довольно просто. Для начала запустим подопытного. У меня будет гуёвая убунта. Запускаю firefox.
/usr/bin/firefox
Можешь с ярлыка на рабочем столе его заранить. А если нет иксов, подставь cron или какой-нибудь свой скрипт который крутится в фоне. Дальше открываем терминал и фапаем:
ps --no-headers -C firefox -o lstart
В ответ видим строку: Sun Jun 16 05:54:24 2024 Это и есть та самая временнáя метка, когда был запущен процесс. В моем случае firefox. Аналогично можно узнать метку любой запущенной программы или процесса. Формат поля lstart универсальный и его понимает тест(-newer) из предыдущего поста про find. Давай поищем файлы в домашнем каталоге, которые были модифицированы после запуска firefox.
find ~/ -newermt "$(ps --no-headers -C firefox -o lstart)"
Выводится достаточно большой список. Это хороший кейс, когда пытаешься что-то отдебажить. Некоторые версии утилиты ps могут создать головняк с поиском процесса по имени. Но эта ситуация легко решается с помощью других утилит для поиска PIDов. Например, с помощью такой кишки:
find ~/ -newermt "$(ps --no-headers -p $(pgrep firefox) -o lstart)"
Думаю концепт ты понял, а дальше можешь самостоятельно пойти и разгрести какой-нибудь /proc/pid/stat или /proc/uptime. Пользуйтесь! ⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ А еще подписывайся на наши полезняшки и заходи попиздеть в чатик. Поржать тут: @devopsina и @devopsgarden tags: #linux #bash — 🔔 @bashdays

Как говорится — у хорошего айтишника и бычий хуй веревка! Привет. Сегодня про find и временные метки. У утилиты find есть ключ -newer. Тест (-newer) возвращает истину, если метка X новее метки Y. Формат теста такой:
-newerXY
Y — Указывает временную метку образца. X — Указывает временную метку искомых файлов.
Временные метки:
с — время изменения m — время модификации a — время последнего доступа t — буквальное время, а не имя файла (только Y) B — время создание файла (поддерживается не везде)
Поддерживаемые форматы (t): Вот несколько из них, которые можно получить с помощью утилиты date.
date --rfc-3339=ns  
date --rfc-2822   
date +'@%s.%N'
TZ=UTC0 date +'%Y-%m-%d %H:%M:%S'  
date +'%Y-%m-%d %H:%M:%S %z'  
LC_ALL=C TZ=UTC0 date  
Также date умеет отнимать/прибавлять даты.
date -d'- 1 hours'
Более подробно можешь почитать в гнутой доке. Или заглянуть командой: info coreutils date Теперь давай поищем файлы в домашнем каталоге у которых время модификации, менялось с заданной даты. Минус 2 часа от текущего времени.
find ~/ -newermt "$(date --rfc-2822 -d '- 2 hours')"
Ага, получаем ожидаемый список. Ок, теперь создадим файл bashdays.txt, у которого время модификации будет -2 часа от текущего времени.
touch -mt $(date '+%Y%m%d%H%M.%S' -d '-2 hours' ) bashdays.txt
Проверяем:
stat bashdays.txt
Смотрим поле Modify, ага все верно, время -2 часа от текущего времени. Снова запускаем поиск файлов, у которых время модификации свежее времени модификации файла bashdays.txt
find ~/ -newermm bashdays.txt
Выводим дополнительную информацию со временем модификации найденных файлов:
find ~/ -newermm bashdays.txt -printf '%t\n'
Допускается задавать разные временные метки искомых файлов и образца. Поиск файлов у которых время модификации новее времени изменения файла bashdays.txt
find ~/ -newermc bashdays.txt -printf '%t\n'
Чтобы узнать, при каких условиях изменяются временные метки. Можете поизучать man-страницы к системному вызову stat. Где это можно применить? Ну например, для зачистки старых бэкапов, если предпочитаешь использовать для этого самописные скрипты. На самом деле дофига где применить можно, всё зависит от фантазии и потребностей. Завтра выходной строим, в воскресение вернусь. Хороших предстоящих выходных, береги себя! tags: #linux #bash — 🔔 @bashdays