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

Как да организираме и управляваме 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 машина

Започнете да добавяте вашите най-често използвани команди и след седмица ще забележите значително увеличение на производителността!

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:

Подобни статии