Каждый, кто проводит в терминале больше пяти минут, сталкивается с одним и тем же: одни и те же длинные команды приходится набирать снова и снова, а рутинные действия отнимают время и внимание. Сначала терпишь, потом — начинаешь оптимизировать.
Простейший алиас в .bashrc или .zshrc кажется небольшим открытием. Первый рабочий скрипт, сохранённый в ~/.local/bin, ощущается как прорыв. Это не просто про лень — это про эффективность, про оптимизацию работы.
Со временем такая «мелкая оптимизация» собирается в целый личный фреймворк или набор утилит для командной строки. Это уже не пара заплаток, а твоя собственная среда, отточенная под конкретные задачи. В этой статье я хочу показать свою коллекцию таких скриптов и алиасов — не как идеальный стандарт, а как пример живого подхода. Возможно, какие-то решения окажутся полезными и вам, а главное — побудят создать что-то своё, ещё более удобное.
Довольно часто в сообществе линукса можно увидеть дискуссию на тему того, когда полезны алиасы, а когда — исполняемые скрипты в условном ~/.local/bin/. Алиасы компактные и быстрые, благодаря этому ими можно заменить небольшие цепочки команд. Но у них есть минусы: например, если задавать в конфиге шелла, то приходится перезагружать сессию. Поэтому иногда удобнее использовать скрипты, так как они могут быть написаны не только на bash, но и на других доступных в системе языках программирования. Ну и, понятное дело, скрипты уже имеют намного больший простор для деятельности.
В этой статье я покажу и алиасы, и скрипты, которые я сам использую на ежедневной основе.
Все скрипты доступны в моём репозитории. Вы можете поделиться своими скриптами в комментариях или через пул-реквест.
❯ NixOS
Начну с набора алиасов для NixOS:
alias rb="sudo nixos-rebuild switch --flake /home/alexeev/nixos/"
alias upd="nix flake update /home/alexeev/nixos/"
alias upg="sudo nixos-rebuild switch --upgrade --flake /home/alexeev/nixos/"
alias nixclean="sudo nix-collect-garbage -d"
alias hms="home-manager switch --flake /home/alexeev/nixos/"
alias conf="nvim ~/nixos/nixos/configuration.nix"
alias pkgs="nvim ~/nixos/nixos/packages.nix"
Позволяет делать ребилд, обновление, очистку системы, а также быстро работать с конфигурацией и пакетами в системе.
❯ Git
Алиасы для git можно делать как стандартным внешним путём:
alias gga="git add"
alias ggc="git commit"
alias ggcm="git commit -m"
alias ggs="git status"
alias ggl="git log"
alias gglo="git log --oneline"
alias ggd="git diff"
alias ggds="git diff --staged"
alias ggr="git restore"
Так и через конфигурирование файла ~/.gitconfig:
[alias]
st = status -b
c = commit
co = checkout
br = branch
slog = log --pretty=format:"%C(auto)%h%C(auto)%d\\ %C(auto,reset)%s\\ \\ [%C(auto,blue)%an%C(auto,reset),\\ %C(auto,cyan)%ar%C(auto,reset)]"
glog = log --graph --pretty=format:"%C(auto,yellow)%h%C(auto)%d\\ %C(auto,reset)%s\\ \\ [%C(auto,blue)%an%C(auto,reset),\\ %C(auto,cyan)%ar%C(auto,reset)]"
wlog = log --pretty=format:"%C(auto,yellow)%h%C(auto)%d%C(auto,reset)\\ by\\ %C(auto,blue)%an%C(auto,reset),\\ %C(auto,cyan)%ar%C(auto,reset)%n\\ %s%n" --stat
gr = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
wt = worktree
Я достаточно часто пользуюсь этими алиасами для быстрой работы с репозиториями, получения логов и графов веток и коммитов.
Также я иногда использую вот такой интересный скрипт:
#!/usr/bin/env python3
import os
import re
class GitVersion:
def __init__(self):
self._default_version = "0.1.0"
os.chdir(os.path.dirname(os.path.realpath(__file__)))
@property
def tag(self):
stream = os.popen("git describe --match v[0-9]* --abbrev=0 --tags")
return stream.read().strip()
@property
def version(self):
version = f"{self.tag[1:]}.{self.build}"
if version == ".":
return self._default_version
return version
@property
def default_branch(self):
stream = os.popen("git config --get init.defaultBranch")
result = stream.read().strip()
if not result:
result = "main"
return result
@property
def build(self):
stream = os.popen(f"git rev-list {self.tag}.. --count")
return stream.read().strip()
@property
def branch(self):
stream = os.popen("git branch --show-current")
return stream.read().strip()
@property
def full(self):
return f"{self.version}-{self.branch}"
@property
def standard(self):
standard = f"{self.version}-{self.branch}"
if self.branch == self.default_branch or re.match("release/.*", self.branch):
standard = f"{self.version}"
return standard
@property
def commit(self):
stream = os.popen("git rev-parse HEAD")
return stream.read().strip()
@property
def commit_hash(self):
stream = os.popen("git rev-parse --short HEAD")
return stream.read().strip()
def __str__(self):
return f"""
Tag: {self.tag}
Version: {self.version}
Full: {self.full}
Branch: {self.branch}
Build: {self.build}
Standard: {self.standard}
Commit: {self.commit}
GitRepo {self.full} {self.commit_hash}
"""
if __name__ == "__main__":
git_version = GitVersion()
print(git_version)
Этот скрипт позволяет получать информацию о репозитории, включая релизные теги в определённом формате (git describe --match v[0-9]* --abbrev=0 --tags). Я сам достаточно часто использую этот скрипт, если надо координировать работу с git-репозиторием. Он использует последний тег (vX.X.X) как базовую версию и добавляет количество коммитов после тега как номер сборки. Для main/release веток версия отображается без имени ветки, для остальных — с именем ветки. Если тегов нет, используется версия 0.1.0. Скрипт полезен для CI/CD пайплайнов, чтобы автоматически генерировать версии сборок.
❯ Полезные алиасы
Я использую достаточно часто алиасы для своего шелла. Например, я через alias ls='exa --icons' заменил ls на утилиту exa.
alias ll="ls -l"
alias se="sudoedit"
alias bat="bat --theme base16"
alias ff=fastfetch
alias nv=nvim
alias v=vim
alias nixfish="echo Enter to nix-shell && nix-shell . --command fish"
alias ..='cd ..'
alias 2..='cd ../..'
alias 3..='cd ../../..'
alias 4..='cd ../../../..'
alias 5..='cd ../../../../..'
Я использую команду nixfish, когда мне нужно войти в nix-shell окружение через командную оболочку fish (так как я использую её на регулярной основе). Остальные — это удобные сокращения команд, от вызовов программ до упрощения команды (как видно в последнем блоке, где идёт переход в предыдущие директории).
Также я использую следующие:
alias syslog_emerg="sudo dmesg --level=emerg,alert,crit"
alias syslog="sudo dmesg --level=err,warn"
alias xlog='grep "(EE)\|(WW)\|error\|failed" ~/.local/share/xorg/Xorg.0.log'
alias vacuum="sudo journalctl --vacuum-size=100M"
alias vacuum_time="sudo journalctl --vacuum-time=2weeks"
alias rm="rmtrash "
alias youtube='yt-dlp -f "bestvideo[height<=1080]+bestaudio" --merge-output-format mp4 --output "%(title)s.%(ext)s"'
alias youtubemp3='yt-dlp -x --audio-format mp3 --output "%(title)s_audio.%(ext)s"'
Первые 5, как видно, помогают взаимодействовать с сообщениями ядра и журналом, а также очищать их. Команду rm я заменяю на утилиту rmtrash, которая перемещает удалённый файл в корзину. Это не раз меня спасало от потери файлов. А команда youtube помогает скачивать видео через yt-dlp в нужном мне формате, а youtubemp3 сохраняет аудио с ютуба в mp3 формате.
❯ Баш-скрипты для любых юзкейсов
Баш-скрипты позволяют реализовать более сложную или кастомизируемую логику.
Например, скрипт tempe.sh создаёт временную директорию и переходит в неё.
А скрипты check-cpu.sh и check-gpu.sh позволяют получить вендора процессора и видеокарты соответственно. Я использую эти скрипты, если, например, нужно установить драйверы под конкретного вендора.
А вот, например, скрипт clean_broken_links.sh:
#!/usr/bin/env bash
# Target directory for scan
TARGET_DIR="$HOME"
# Search and delete broken symlinks
find "$TARGET_DIR" -xtype l -print -delete
echo "✅ All broken symlinks deleted from $TARGET_DIR"
Он очищает рекурсивно директорию от сломанных симлинков, что позволяет содержать систему в чистоте и не засорять её.
Продолжая тему очистки и сортировки, можно упомянуть скрипт clean_downloads_dir.py. Он написан на Python и позволяет сортировать директорию (по умолчанию — ~/Downloads), причём можно кастомизировать файлы с каким расширением в какую директорию сортировать через файл extensions.json в текущей директории. Если его нет — он создаётся сам и заполняется значениями по умолчанию. Я лично пользуюсь им часто, и не только для директории Downloads.
В то время, когда я ещё сидел на Arch Linux, я написал небольшой скрипт для очистки арча (требуется пакет pacman-contrib для paccache):
#!/usr/bin/env bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
PURPLE='\033[0;37m'
END='\033[0m'
printf "${GREEN}Cleaning...${END}\n"
printf "${RED}[+] Full system update${END}\n"
sudo pacman -Syu
printf "${BLUE}[+] Clean pacman cache${END}\n"
sudo pacman -Scc
sudo paccache -r
sudo paccache -rk1
sudo paccache -ruk0
printf "${CYAN}[+] Clean orphans${END}\n"
sudo pacman -Rns $(pacman -Qtdq)
printf "${PURPLE}[+] Clean font cache${END}\n"
fc-cache -frv
printf "${YELLOW}[+] Clean cache and tmp${END}\n"
sudo truncate -s 0 /var/log/pacman.log
sudo truncate -s 0 /var/log/pacman.log
rm -rf ~/.cache/
sudo rm -rf /tmp/*
printf "${GREEN}End!${END}\n"
Кроме того, часто бывает полезно очищать старые временные файлы (delete_old_temp_files.sh):
#!/usr/bin/env bash
TARGET_DIR="/tmp"
MAX_AGE=7
find "$TARGET_DIR" -type f -mtime +$MAX_AGE -exec rm -v {} \;
echo "✅ Delete temporary files that are more $MAX_AGE days from $TARGET_DIR"
Если мне нужно получить какой-нибудь эмодзи, я использую скрипт emoji.sh, который позволяет получать по названию эмодзи (emoji.sh smile).
Также из этой статьи я позаимствовал себе в систему следующие скрипты:
_mkcd foo_создаёт каталог и переходит в него черезcd. По сути, это командаmkdir foo && cd foo. Я этим скриптом пользуюсь постоянно — почти при каждом создании каталога._mksh_позволяет быстро создавать скрипты оболочки. К примеру,mksh foo.shсоздаётfoo.sh, делает его исполняемым с помощьюchmod u+x, добавляет префиксы Bash и открывает скрипт в редакторе (в моём случае Vim). Пригождается раз в несколько дней. Многие из перечисленных в этой статье скриптов были созданы с помощьюmksh._url "$my_url"_парсит URL-адрес на составляющие части. Использую примерно раз в месяц для получения информации об URL, зачастую просто потому, что не хочу кликать по ссылке с трекером.
❯ Работа с сетью
Для работы с сетью у меня есть целый набор скриптов:
check_wifi_connection.sh — отслеживание изменений подключённой Wi-Fi сети. Скрипт определяет текущую Wi-Fi сеть и уведомляет о её смене. Автоматически сохраняет последнюю SSID в файл
~/.last_ssidи записывает изменения в лог~/.wifi_changes.log. Используйте для мониторинга роуминга между точками доступа.check_wifi_status.sh — проверка доступности интернета через ping. Проверяет соединение с Google DNS (8.8.8.8) и уведомляет о потере/восстановлении подключения. Все события логируются в
~/.network_status.log. Запускайте периодически через cron для постоянного мониторинга.detect_network_changes.sh — обнаружение изменений внешнего IP-адреса. Мониторит публичный IP через ifconfig.me каждую минуту, фиксирует изменения и отправляет уведомления. Полезен для отслеживания переподключений, смены провайдера или динамических IP. Логирует в
~/.network_changes.log.detect_new_devices_in_net.sh — сканирование локальной сети на наличие новых устройств. Использует arp-scan для обнаружения MAC-адресов, сравнивает с сохранённым списком
~/.known_devices.txtи уведомляет о новых девайсах. Требует установкиarp-scan. Запускайте периодически для безопасности домашней сети.httpstatus.sh — справочник HTTP-статус кодов. Выводит полный список кодов от 100 до 511 с описаниями. Поддерживает поиск по ключевым словам при передаче аргументов. Используйте как
./httpstatus.sh 404для быстрого поиска или./httpstatus.shдля полного списка.list_of_wifi_nets.sh — мониторинг доступных Wi-Fi сетей в реальном времени. Показывает SSID, уровень сигнала и индикаторы качества, сортирует по силе сигнала. Обновляет список каждые 5 секунд. Использует
nmcli. Запускайте при поиске лучшей точки доступа.monitoring_net_activity.sh — мониторинг сетевого трафика в реальном времени. Измеряет скорость входящего (RX) и исходящего (TX) трафика на указанном интерфейсе (по умолчанию wlo1), обновляя данные каждую секунду. Показывает скорость в KB/s. Используйте для анализа загрузки сети.
network_analysis.sh — комплексный анализ сетевого состояния системы. Собирает статистику интерфейсов, подсчитывает соединения по состояниям, определяет топ-10 процессов по сетевой активности, показывает нестандартные открытые порты и статистику ошибок. Запускайте для диагностики сетевых проблем.
❯ Работа с systemd
Когда-то давно я писал статью про работу с systemd, где в конце прилагал скрипт-обёртку для самого systemd. Я его немного улучшил и модифицировал — systemdwrapper.py.
usage: systemdwrapper.py [-h] {version,disable,enable,restart,stop,start,status,startuptime,failed,active,stats,chain,export} ...
Утилита для управления службами systemd и анализа времени загрузки
positional arguments:
{version,disable,enable,restart,stop,start,status,startuptime,failed,active,stats,chain,export}
Доступные команды
version Получить версию systemd
disable Выключить службу
enable Включить службу
restart Перезапустить службу
stop Остановить службу
start Запустить службу
status Показать статус службы
startuptime Анализ времени запуска системы и служб
failed Показать неудачные службы
active Показать активные службы
stats Показать статистику системы
chain Анализ критической цепочки службы
export Экспорт отчёта в JSON
options:
-h, --help show this help message and exit
Например, при запуске с командой startuptime скрипт парсит вывод команд и выводит такой результат:
Статистика загрузки:
Самая медленная служба (3780.0ms): NetworkManager-wait-online.service
Самая быстрая служба (7.0ms): sys-kernel-config.mount
Среднее арифметическое времени запуска служб: 159.9ms
Медиана времени запуска служб: 44.0ms
Общее время запуска всех служб: 11193.0ms
Службы с временем запуска > 1000ms:
3780.0ms - NetworkManager-wait-online.service
Кроме того, у меня есть ещё вспомогательный баш-скрипт slowest_services_to_launch.sh, который записывает топ‑10 самых медленных сервисов в лог-файл:
#!/usr/bin/env bash
LOG_FILE="/var/log/boot_time.log"
echo "🕰 Analyze system startup time" | tee -a $LOG_FILE
BOOT_TIME=$(systemd-analyze)
BLAME=$(systemd-analyze blame | head -n 10)
{
echo "⏱️ $(date)"
echo "$BOOT_TIME"
echo "📌 Ten most slowest services:"
echo "$BLAME"
echo "-----------------------------"
} >> $LOG_FILE
echo "✅ Данные сохранены." | tee -a $LOG_FILE
Продолжая тему работы с сервисами, иногда может пригодиться скрипт ниже. Он позволяет перезапускать определённые сервисы systemd, если они не работают:
#!/usr/bin/env bash
SERVICES=("nginx" "postgresql")
LOG_FILE="/var/log/systemd_healthcheck.log"
echo "🔍 Check services status... $(date)" | tee -a $LOG_FILE
for svc in "${SERVICES[@]}"; do
systemctl is-active --quiet "$svc"
STATUS=$?
if [ $STATUS -ne 0 ]; then
echo "❌ Service $svc does not worked. Restart him..." | tee -a $LOG_FILE
systemctl restart "$svc"
sleep 1
systemctl is-active --quiet "$svc" && echo "✅ $svc started now." | tee -a $LOG_FILE
else
echo "✔️ $svc is worked." | tee -a $LOG_FILE
fi
done
❯ Авто-монтирование дисков
В минимальных системах, или без наличия полноценного DE, монтирование иногда приходится осуществлять вручную. Специально для этого я написал скрипт auto_mount_devices.sh:
#!/usr/bin/env bash
MOUNT_DIR="$HOME/MOUNTED_DEVICE"
mkdir -p "$MOUNT_DIR"
DEVICE=$(lsblk -o NAME,TYPE,HOTPLUG | awk '$2 == "disk" && $3 == 1 {print $1}' | tail -n1)
if [ -n "$DEVICE" ]; then
PARTITION="/dev/${DEVICE}1"
mkdir -p "$MOUNT_DIR/$PARTITION"
sudo mount "$PARTITION" "$MOUNT_DIR/$PARTITION"
echo "✅ Device $PARTITION mounted to $MOUNT_DIR/$PARTITION"
else
echo "❌ USB-device not found"
fi
❯ Проверяем остаток свободного места
Этот скрипт крайне простой, его задача в том чтобы парсить остаток свободного места и если его меньше 90%, то сообщать об этом. Этот скрипт можно оформить в виде фонового демона или интегрировать в ваш WM, к примеру.
#!/usr/bin/env bash
THRESHOLD=90
LOG_FILE="$HOME/.disk_usage.log"
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -ge "$THRESHOLD" ]; then
MESSAGE="⚠️ Disk space is used by $DISK_USAGE%!"
echo "$MESSAGE" | tee -a "$LOG_FILE"
notify-send "Disk Alert" "$MESSAGE"
fi
❯ Проверка использования процессора
Абсолютно аналогичный предыдущему скрипт, только вместо места на диске — нагрузка на процессор.
#!/usr/bin/env bash
THRESHOLD=80
LOG_FILE="$HOME/.cpu_usage.log"
CPU_LOAD=$(awk '{print $1}' < /proc/loadavg | awk '{print $1*100}')
if (( ${CPU_LOAD%.*} >= THRESHOLD )); then
MESSAGE="⚠️ High CPU Usage: $CPU_LOAD%"
echo "$MESSAGE" | tee -a "$LOG_FILE"
notify-send "CPU Alert" "$MESSAGE"
fi
❯ Детектинг изменения подключённых USB-девайсов
Данный скрипт при первом запуске сохраняет текущие USB-девайсы в лог-файл, затем перепроверяет и сравнивает текущие подключения с подключениями из файла. Такой скрипт можно также оформить в виде демона.
#!/usr/bin/env bash
LOG_FILE="/var/log/usb_changes.log"
STATE_FILE="/var/log/usb_changes/usb_state.txt"
mkdir -p /var/log/usb_changes
echo "🔍 Searching installed USB... $(date)" | tee -a "$LOG_FILE"
lsusb > /var/log/current_usb.txt
if [ ! -f "$STATE_FILE" ]; then
cp /var/log/current_usb.txt "$STATE_FILE"
echo "📦 First save for USB" | tee -a "$LOG_FILE"
exit 0
fi
if ! diff "$STATE_FILE" /var/log/current_usb.txt >/dev/null; then
echo "⚠️ USB Connections changed" | tee -a "$LOG_FILE"
echo "--- After:" | tee -a "$LOG_FILE"
cat "$STATE_FILE" | tee -a "$LOG_FILE"
echo "--- Before:" | tee -a "$LOG_FILE"
cat /var/log/current_usb.txt | tee -a "$LOG_FILE"
cp /var/log/current_usb.txt "$STATE_FILE"
else
echo "✅ USB Connections not changed" | tee -a "$LOG_FILE"
fi
rm /var/log/current_usb.txt
❯ Анализ использования памяти
Этот скрипт я задействую для краткой сводки по памяти, здесь собирается вывод команды free -h, информация из /proc/meminfo, сортировка процессов по использованию RSS-памяти, процессы с большим использованием грязных страниц и memory pressure.
Resident set size (RSS) — термин, который в контексте управления памятью в операционной системе означает размер страниц памяти, выделенных процессу и в настоящее время находящихся в ОЗУ (RAM).
Memory pressure — это термин, используемый для описания состояния компьютерной системы, когда её доступные ресурсы памяти используются в большом объёме.
#!/usr/bin/env bash
echo "=== Memory Analysis and OOM Killer Candidate Processes ==="
echo "Timestamp: $(date)"
echo ""
echo "1. Memory Summary:"
echo "-------------------"
free -h
echo ""
echo "2. Detailed RAM and Swap Usage:"
echo "----------------------------------------"
cat /proc/meminfo | grep -E "(MemTotal|MemAvailable|SwapTotal|SwapFree|SwapCached)"
echo ""
echo "3. Top 10 Processes by Resident Memory (RSS) Usage:"
echo "-------------------------------------------------------------"
ps aux --sort=-%mem | awk 'NR<=11 {printf "%-8s %-6s %-4s %-8s %-8s %s\n", $2, $1, $4, $3, $6/1024" MB", $11}'
echo ""
echo "4. Processes with Large Amounts of Dirty Memory:"
echo "------------------------------------------------------------------"
for pid in $(ps -eo pid --no-headers); do
if [ -f /proc/$pid/statm ]; then
dirty_pages=$(grep -i "Private_Dirty:" /proc/$pid/smaps 2>/dev/null | awk '{sum += $2} END {print sum}')
if [ -n "$dirty_pages" ] && [ "$dirty_pages" -gt 1000 ]; then
proc_name=$(cat /proc/$pid/comm 2>/dev/null)
dirty_kb=$((dirty_pages * 4))
echo "PID: $pid, Name: $proc_name, Dirty Memory: $dirty_kb KB"
fi
fi
done | sort -k6 -nr | head -10
echo ""
echo "5. Memory Pressure (PSI):"
echo "---------------------------"
if [ -f /proc/pressure/memory ]; then
cat /proc/pressure/memory
else
echo "Memory pressure information is not supported in this kernel version."
fi
echo ""
Если вы хотите узнать больше о работе памяти в линуксе, я писал об этом статью, где подробно разобрал всё.
❯ Вывод температуры CPU и NVIDIA GPU
Данный скрипт через sensors и nvidia-smi выводит информацию о температуре вашего процессора и видеокарты (nvidia):
#!/usr/bin/env bash
echo -e "\033[1;36m=== Temperatures ===\033[0m"
# CPU
cpu_temp=$(sensors | grep -E "Core [0-9]:" | awk '{print $3}' | sed 's/+//;s/°C//' | sort -nr | head -n1)
echo -e "🔥 \033[1;32mCPU: \033[1;33m${cpu_temp}°C\033[0m"
# GPU (NVIDIA)
if command -v nvidia-smi &> /dev/null; then
gpu_temp=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader 2>/dev/null)
if [ -n "$gpu_temp" ]; then
echo -e "🎮 \033[1;32mGPU: \033[1;33m${gpu_temp}°C\033[0m"
fi
fi
❯ Авто-форматирование C/C++ кода
Этот скрипт на Python я использую в своих C/C++ проектах, он является обёрткой для clang-format. Для меня он удобен тем, что автоматизирует рекурсивное форматирование и стили, и можно добавлять прочие форматтеры и запускать их все вместе через этот скрипт.
import argparse
import os
import subprocess
count = 0
def find_source_files(root_dir, ignore_dirs):
source_files = []
for dirpath, dirnames, filenames in os.walk(root_dir):
dirnames[:] = [d for d in dirnames if d not in ignore_dirs]
for filename in filenames:
if filename.endswith((".c", ".cpp", ".h", ".hpp", ".cc", ".cxx", ".hh")):
source_files.append(os.path.join(dirpath, filename))
return source_files
def format_files(files, clang_format, style):
global count
for file in files:
try:
cmd = [clang_format, "-i", "--style", style, file]
subprocess.run(cmd, check=True)
print(f"\033[32mFormatted:\033[0m {file}")
count += 1
except subprocess.CalledProcessError as e:
print(f"\033[31mError formatting {file}:\033[0m {e}")
def main():
parser = argparse.ArgumentParser(
description="Recursively format C/C++ files with clang-format"
)
parser.add_argument("root_dir", help="Root directory to search for source files")
parser.add_argument("--ignore", nargs="+", default=[], help="Directories to ignore")
parser.add_argument(
"--clang-format", default="clang-format", help="Path to clang-format executable"
)
parser.add_argument(
"--style", default="file", help="Formatting style (file/Google/LLVM/etc.)"
)
args = parser.parse_args()
print("\033[36m=== C/C++ Source Formatter ===\033[0m")
print(f"\033[33mRoot directory:\033[0m {args.root_dir}")
print(f"\033[33mIgnored directories:\033[0m {args.ignore or 'None'}")
print(f"\033[33mStyle:\033[0m {args.style}")
print("\033[36m" + "=" * 30 + "\033[0m")
source_files = find_source_files(args.root_dir, args.ignore)
if not source_files:
print("\033[33mNo C/C++ files found to format.\033[0m")
return
print(f"\033[33mFound {len(source_files)} files to format:\033[0m")
format_files(source_files, args.clang_format, args.style)
print(f"\033[32mFormatting complete ({count} files)!\033[0m")
if __name__ == "__main__":
main()
❯ Проверка SSL-сертификата
Данный скрипт позволяет проверить, сколько дней осталось до даты истечения SSL-сертификата.
#!/usr/bin/env python3
import socket
import sys
import ssl
from datetime import datetime, timezone
def check_ssl_expiry(domain, days_before=7):
context = ssl.create_default_context()
with socket.create_connection((domain, 443)) as sock:
with context.wrap_socket(sock, server_hostname=domain) as ssock:
cert = ssock.getpeercert()
expiry_date = datetime.strptime(cert["notAfter"], "%b %d %H:%M:%S %Y %Z")
remaining_days = (expiry_date - datetime.now(timezone.utc).replace(tzinfo=None)).days
print(f'Domain: {domain}')
print(f"Remaining days: {remaining_days}")
print(f'Days before: {days_before}')
check_ssl_expiry(sys.argv[1])
❯ Универсальный разархиватор
Этот скрипт полезен, если вам нужно единой командой извлечь содержимое архива, автоматически подобрать команду под расширение.
#!/usr/bin/env bash
# extract.sh [archive file] [optional: output directory]
main() {
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
echo "Usage: extract.sh [archive file] [optional: output directory]"
exit 1
fi
file="$1"
output_dir="${2:-.}"
if ! [ -f "$file" ]; then
echo "File $file does not exist."
exit 1
fi
if ! [ -d "$output_dir" ]; then
mkdir -p "$output_dir" || { echo "Failed to create output directory $output_dir"; exit 1; }
echo "Created output directory $output_dir"
fi
extract_file "$file" "$output_dir"
}
extract_file() {
local file=$1
local output_dir=$2
case "$file" in
*.tar.xz) command_exists "tar" && tar -xvf "$file" -C "$output_dir" ;;
*.tar.gz) command_exists "tar" && tar -xzf "$file" -C "$output_dir" ;;
*.tar.bz2) command_exists "tar" && tar -xjf "$file" -C "$output_dir" ;;
*.tar) command_exists "tar" && tar -xf "$file" -C "$output_dir" ;;
*.tgz) command_exists "tar" && tar -xzf "$file" -C "$output_dir" ;;
*.bz|*.bz2) command_exists "bzip2" && bzip2 -d -k "$file" ;;
*.gz) command_exists "gunzip" && gunzip "$file" -c > "$output_dir" ;;
*.zip|*.jar) command_exists "unzip" && unzip "$file" -d "$output_dir" ;;
*.Z) command_exists "zcat" && zcat "$file" | tar -xvf - -C "$output_dir" ;;
*.rar) command_exists "rar" && rar x "$file" "$output_dir" ;;
*.7z) command_exists "7z" && 7z x "$file" -o"$output_dir" ;;
*) echo "Unsupported archive format." ;;
esac
}
command_exists() {
command -v "$1" >/dev/null 2>&1 || { echo >&2 "I require $1 but it's not installed. Aborting."; exit 1; }
}
main "$@"
В дополнение к этому я нашёл интересный комментарий из этой статьи.

❯ Заключение
Перед использованием скриптов с sudo или из неизвестных источников всегда проверяйте их содержимое. Не запускайте скрипты от root без понимания, что они делают.
Спасибо за прочтение статьи! Я надеюсь, вы узнали что‑то новенькое, или, может, какой‑нибудь алиас или скрипт натолкнул вас на другие идеи. Если нашли нюанс в самой статье — пишите в комментарии.
Если вам понравился изложенный материал, могу предложить вам подписаться на мой блог в телеграме. Если, конечно, вам статья понравилась и вы хотите видеть чуть больше.
А сами скрипты вы можете увидеть в моём репозитории. Там вы можете найти ещё больше скриптов на разных языках программирования, а также через PR поделиться своими наработками.
Источники
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩
