Как да организираме и управляваме Linux команди с fzf

Всеки Linux администратор или power user се сблъсква с проблема да помни стотици команди, особено тези със сложни параметри и pipe комбинации. Това ръководство представя елегантно решение, базирано на fzf, текстов файл и Bash alias-и.
Защо това решение?
- ✅ Бързо – търсене в реално време с
fzf - ✅ Просто – всичко е в един текстов файл
- ✅ Гъвкаво – описания, тагове и категории
- ✅ Offline – не зависи от интернет връзка
- ✅ Преносимо – лесно се синхронизира между машини
Предварителни изисkvания
Инсталирайте необходимите инструменти:
За Linux:
sudo apt install fzf xclip
За WSL2 (Windows Subsystem for Linux):
sudo apt install fzf
# xclip не е нужен - използва се вградената clip.exe
- fzf – инструмент за бързо търсене и селектиране
- xclip (само за Linux) – копира текст в системния clipboard
- clip.exe (вграден в WSL2) – копира в Windows clipboard
Стъпка 1: Създайте файла за команди
touch ~/.commands.txt
Стъпка 2: Конфигурирайте Bash alias-ите
Отворете .bashrc:
nano ~/.bashrc
Добавете следните alias-и в края на файла:
# ==========================================
# Система за управление на Linux команди
# ==========================================
# Търсене и копиране на команда
cmd() {
local selected=$(cat ~/.commands.txt | grep -v "^#" | grep -v "^$" | \
fzf --height=80% \
--layout=reverse \
--border=rounded \
--margin=1 \
--padding=1 \
--info=inline \
--prompt="🔍 Търси команда: " \
--pointer="▶" \
--marker="✓" \
--color="fg:#d0d0d0,bg:#1e1e1e,hl:#5f87af" \
--color="fg+:#ffffff,bg+:#3a3a3a,hl+:#5fd7ff" \
--color="info:#af87ff,prompt:#5fd7ff,pointer:#ff5f5f" \
--color="marker:#87ff00,spinner:#ff87d7,header:#87afaf" \
--preview='echo -e "\033[1;36mОписание:\033[0m" && echo {} | cut -d"|" -f1 | sed "s/^[ \t]*//" && echo -e "\n\033[1;33mТагове:\033[0m" && echo {} | cut -d"|" -f2 | sed "s/^[ \t]*//" && echo -e "\n\033[1;32mКоманда:\033[0m" && echo {} | sed "s/.*|| //"' \
--preview-window=right:40%:wrap)
if [ -n "$selected" ]; then
local command=$(echo "$selected" | sed 's/.*|| //')
if grep -qi microsoft /proc/version; then
echo "$command" | clip.exe
else
echo "$command" | xclip -sel clip
fi
echo -e "\033[1;32m✓ Копирано:\033[0m $command"
fi
}
# Добавяне на нова команда
alias cmdadd='_cmdadd() { echo "$1 || $2 || $3" >> ~/.commands.txt && echo "✓ Добавено: $1"; }; _cmdadd'
# Редактиране на файла
alias cmdedit='nano ~/.commands.txt'
# Преглед на всички команди
alias cmdlist='cat ~/.commands.txt | grep -v "^#" | grep -v "^$" | column -t -s "||"'
Запазете файла (Ctrl+O, Enter, Ctrl+X) и презаредете конфигурацията:
source ~/.bashrc
Стъпка 3: Структура на командите
Всяка команда има три компонента, разделени с ||:
ОПИСАНИЕ || ТАГОВЕ || КОМАНДА
- ОПИСАНИЕ – кратко описание на какво прави командата
- ТАГОВЕ – ключови думи за търсене (разделени със запетая)
- КОМАНДА – самата команда за изпълнение
Пример:
Създай tar.gz архив || tar,архив,компресия,backup || tar -czf backup.tar.gz folder/
Стъпка 4: Примерни команди
Отворете файла за редакция:
cmdedit
Добавете примерно съдържание:
# ==========================================
# АРХИВИРАНЕ И КОМПРЕСИЯ
# ==========================================
Създай tar.gz архив || tar,архив,компресия,backup || tar -czf backup.tar.gz folder/
Разархивирай tar.gz || tar,разархивиране,extract || tar -xzf archive.tar.gz
Виж съдържанието на архив || tar,list,view || tar -tzf archive.tar.gz
Създай zip архив || zip,архив,компресия || zip -r archive.zip folder/
Разархивирай zip || zip,unzip,extract || unzip archive.zip
Създай архив с изключения || tar,exclude,backup || tar -czf backup.tar.gz --exclude='*.log' folder/
# ==========================================
# DOCKER
# ==========================================
Изчисти всичко в Docker || docker,clean,prune,cleanup || docker system prune -a --volumes
Влез в контейнер || docker,exec,bash,shell || docker exec -it container_name bash
Виж логове в реално време || docker,logs,tail || docker logs -f container_name
Спри всички контейнери || docker,stop,kill || docker stop $(docker ps -q)
Изтрий неизползвани образи || docker,images,clean || docker image prune -a
Виж ресурсите на контейнерите || docker,stats,resources || docker stats --no-stream
# ==========================================
# GIT
# ==========================================
Красив git log || git,log,history,graph || git log --oneline --graph --all --decorate
Отмени последния commit || git,reset,undo || git reset --soft HEAD~1
Виж разликите преди commit || git,diff,changes || git diff --staged
Търси в историята || git,search,grep || git log --all --grep='search term'
Изтрий локален branch || git,branch,delete || git branch -d branch_name
Клонирай само последния commit || git,clone,shallow || git clone --depth 1 repo_url
# ==========================================
# ТЪРСЕНЕ И ФАЙЛОВЕ
# ==========================================
Намери файлове по име || find,search,locate || find . -name "*.log"
Намери големи файлове || find,size,disk || find . -type f -size +100M
Изтрий стари логове || find,delete,cleanup,old || find . -name "*.log" -mtime +30 -delete
Търси текст във файлове || grep,search,text || grep -r "текст" /path/
Търси и покажи имената || grep,files,list || grep -rl "текст" /path/
Премени разширения масово || rename,extension,batch || for f in *.txt; do mv "$f" "${f%.txt}.md"; done
# ==========================================
# СИСТЕМНИ КОМАНДИ
# ==========================================
Виж заети портове || ports,netstat,listening || sudo netstat -tulpn | grep LISTEN
Процеси по CPU заемане || top,processes,cpu || ps aux --sort=-%cpu | head -n 10
Процеси по памет || top,processes,memory,ram || ps aux --sort=-%mem | head -n 10
Дисково пространство || disk,space,df,storage || df -h | grep -v tmpfs
Размер на папки || disk,du,folder,size || du -sh */ | sort -hr
Виж системната информация || info,system,hardware || lscpu && free -h && df -h
# ==========================================
# МРЕЖА
# ==========================================
Тествай връзка с ping || network,ping,test || ping -c 4 google.com
Виж активни връзки || network,connections,netstat || ss -tuln
Проверка на DNS || dns,nslookup,resolve || nslookup domain.com
Изтегли файл || download,wget,curl || wget -c url_to_file
Тествай скоростта || network,speed,test || curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python3 -
# ==========================================
# RSYNC И BACKUP
# ==========================================
Синхронизирай папки || rsync,sync,backup,copy || rsync -avz --progress source/ dest/
Синхронизирай през SSH || rsync,ssh,remote,backup || rsync -avz -e ssh source/ user@host:/dest/
Синхронизирай с изтриване || rsync,sync,mirror,delete || rsync -avz --delete source/ dest/
Dry run преди синхронизация || rsync,test,preview || rsync -avz --dry-run source/ dest/
# ==========================================
# PERMISSIONS И OWNERSHIP
# ==========================================
Смени собственик рекурсивно || chown,owner,recursive || sudo chown -R user:group /path/
Права 755 за папки || chmod,permissions,folders || find . -type d -exec chmod 755 {} \;
Права 644 за файлове || chmod,permissions,files || find . -type f -exec chmod 644 {} \;
Направи скрипт изпълним || chmod,executable,script || chmod +x script.sh
# ==========================================
# TEXT PROCESSING
# ==========================================
Замени текст във файлове || sed,replace,substitute || sed -i 's/old/new/g' file.txt
Покажи само уникални редове || sort,unique,distinct || sort file.txt | uniq
Брой редове във файл || wc,count,lines || wc -l file.txt
Извади колона от CSV || cut,csv,column || cut -d',' -f1 file.csv
Обедини файлове || cat,merge,combine || cat file1.txt file2.txt > merged.txt
Как се използва?
1. Търсене и копиране на команда
Напишете в терминала:
cmd
Ще се отвори интерактивен интерфейс, където можете да:
- Пишете за търсене (например "архив", "docker", "tar")
- Виждате описанието и таговете
- Виждате preview на командата долу
- Натискате Enter за копиране в clipboard
- Paste с Ctrl+Shift+V в терминала
2. Добавяне на нова команда
cmdadd "Описание на командата" "tag1,tag2,tag3" "самата команда"
Пример:
cmdadd "Синхронизирай с изключени .git папки" "rsync,sync,exclude,git" "rsync -avz --exclude='.git' source/ dest/"
3. Редактиране на командите
cmdedit
Отваря файла в nano за директна редакция.
4. Преглед на всички команди
cmdlist
Показва форматирана таблица с всички налични команди.
Съвети за организация
Използвайте категории с коментари
Коментарите (линии започващи с #) се игнорират от fzf и помагат за визуална организация:
# === Git команди ===
# === Docker команди ===
# === Системни команди ===
Добавяйте множество тагове
Колкото повече релевантни тагове, толкова по-лесно ще намирате командата:
Синхронизирай папки || rsync,sync,backup,copy,mirror,transfer || rsync -avz source/ dest/
Документирайте сложни команди
За особено сложни команди, добавете подробно описание:
Намери и изтрий файлове над 100MB по-стари от 30 дни || find,delete,size,old,cleanup || find . -type f -size +100M -mtime +30 -delete
Синхронизация между машини
Можете лесно да синхронизирате вашите команди между различни компютри:
Вариант 1: Git repository
# На първата машина
cd ~
git init
git add .commands.txt .bashrc
git commit -m "Initial commands"
git remote add origin your_repo_url
git push -u origin master
# На втората машина
cd ~
git clone your_repo_url
source ~/.bashrc
Вариант 2: Symlink към cloud папка
# Преместете файла в синхронизирана папка
mv ~/.commands.txt ~/Dropbox/commands.txt
# Създайте symlink
ln -s ~/Dropbox/commands.txt ~/.commands.txt
Импорт на съществуващи команди
Конвертиране от стар формат
Ако имате команди записани във формат:
команда
Описание на командата
команда2
Описание на командата2
Пример:
scp /home/fedia/.ssh: /mnt/c/Users/fedia/Desktop
Копира .ssh на Desktopа
chmod 600 tablet.id_rsa
Задава права за частен ключ.
docker ps -a
Показва всички контейнери (включително спрелите)
Можете автоматично да ги конвертирате към новия формат:
Стъпка 1: Създайте временен файл и копирайте старите команди:
nano ~/old_commands.txt
Копирайте вашите команди (команда на един ред, описание на следващия) и запазете файла.
Стъпка 2: Конвертирайте автоматично:
awk 'NR%2==1 {cmd=$0; next} {print $0 " || auto || " cmd}' ~/old_commands.txt >> ~/.commands.txt
Този скрипт:
- Чете по 2 реда наведнъж
- Първият ред е командата
- Вторият ред е описанието
- Форматира ги в нужния формат:
Описание || auto || команда
Стъпка 3: Проверете резултата:
tail -10 ~/.commands.txt
Трябва да видите:
Копира .ssh на Desktopа || auto || scp /home/fedia/.ssh: /mnt/c/Users/fedia/Desktop
Задава права за частен ключ. || auto || chmod 600 tablet.id_rsa
Показва всички контейнери (включително спрелите) || auto || docker ps -a
Стъпка 4: Подобрете таговете (опционално):
Отворете файла и заменете auto с по-смислени тагове:
cmdedit
Или масово заменете за определени команди:
# Замяна за docker команди
sed -i 's/ || auto || docker/ || docker,container || docker/g' ~/.commands.txt
# Замяна за chmod команди
sed -i 's/ || auto || chmod/ || chmod,permissions,rights || chmod/g' ~/.commands.txt
# Замяна за scp команди
sed -i 's/ || auto || scp/ || scp,copy,ssh,transfer || scp/g' ~/.commands.txt
Стъпка 5: Тествайте:
cmd
Търсете "docker", "chmod" или "copy" – командите трябва да се намират!
Разширени възможности
Изпълнение вместо копиране
Ако искате директно да изпълнявате командата вместо да я копирате:
cmdrun() {
local selected=$(cat ~/.commands.txt | grep -v "^#" | grep -v "^$" | fzf --preview='echo {}' --preview-window=up:3:wrap)
if [ -n "$selected" ]; then
local command=$(echo "$selected" | sed 's/.*|| //')
echo "Изпълнявам: $command"
eval "$command"
fi
}
Използвайте cmdrun вместо cmd.
Често задавани въпроси
fzf не работи
# Проверете дали е инсталиран
which fzf
# Инсталирайте отново
sudo apt install fzf
xclip не копира
# Проверете дали е инсталиран
which xclip
# Инсталирайте отново
sudo apt install xclip
# Тествайте ръчно
echo "test" | xclip -sel clip
Командите не се зареждат след презареждане
# Уверете се, че alias-ите са в .bashrc
cat ~/.bashrc | grep "alias cmd"
# Презаредете конфигурацията
source ~/.bashrc
Заключение
Тази система за управление на команди е:
- Лека – не изисква допълнителни бази данни или сложни инструменти
- Бърза –
fzfпредоставя мигновено търсене - Гъвкава – лесно се адаптира към вашите нужди
- Преносима – работи на всяка Linux машина
Започнете да добавяте вашите най-често използвани команди и след седмица ще забележите значително увеличение на производителността!
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut








