Показать сообщение отдельно
Старый Вчера, 06:36   #2
Дмитрий
Администратор
 
Аватар для Дмитрий
 
Турниров выиграно: 1

Регистрация: 12.12.2008
Адрес: Москва прошлого тысячелетия.
Сообщений: 218,008
Сказал(а) спасибо: 46,234
Поблагодарили 275,543 раз(а) в 104,685 сообщениях
Дмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспорима
По умолчанию

Код:
#!/bin/bash

# 1. Проверка наличия аргумента
if [ -z "$1" ]; then
    echo "❌ Ошибка: Не указан поисковый запрос."
    echo "💡 Использование: $0 \"ключевые слова для поиска\""
    echo "   Пример: $0 \"matrix 1999\""
    exit 1
fi

search_query="$1"

# 2. ПУТЬ К ФАЙЛУ (Явные примеры для разных ОС)
# Для Windows (WSL): /mnt/c/Users/ВашеИмя/Downloads/rutracker.xml
# Для Linux: /home/ВашеИмя/Downloads/rutracker.xml
# Для macOS: /Users/ВашеИмя/Downloads/rutracker.xml
path_to_rutracker_xml="/mnt/c/Users/ВашеИмя/Downloads/rutracker.xml"

if [ ! -f "$path_to_rutracker_xml" ]; then
    echo "❌ Ошибка: Файл '$path_to_rutracker_xml' не найден."
    echo "   Откройте скрипт в текстовом редакторе и укажите реальный путь к XML."
    exit 1
fi

echo "🔍 Ищем в базе: \"$search_query\" ..."
echo "================================================================"

# 3. Поиск с помощью GNU Awk (gawk)
# RS="</torrent>" надежно выделяет весь блок раздачи целиком, 
# избегая проблем с вложенным тегом <torrent hash="..."/>
gawk -v IGNORECASE=1 -v RS="</torrent>" -v query="$search_query" '
BEGIN {
    # Разбиваем поисковый запрос на отдельные слова для логики "И" (AND)
    n = split(query, words, " ")
}

# Пропускаем пустые блоки или XML-заголовок до первого <torrent>
$0 !~ /<torrent/ { next }

{
    # Проверяем, что ВСЕ слова из запроса присутствуют в текущем блоке раздачи
    found = 1
    for (i = 1; i <= n; i++) {
        if ($0 !~ words[i]) {
            found = 0
            break
        }
    }

    # Если все слова найдены, извлекаем данные
    if (found) {
        # Извлекаем Title: ищем <title>текст</title>
        title = ""
        if (match($0, /<title>[^<]+<\/title>/)) {
            # RSTART+7 пропускает "<title>", RLENGTH-15 убирает "<title>" и "</title>" (7+8=15)
            title = substr($0, RSTART + 7, RLENGTH - 15)
        }

        # Извлекаем Hash: используем capture group gawk для точного извлечения из атрибута
        hash = ""
        if (match($0, /hash="([A-Fa-f0-9]{40})"/, arr)) {
            hash = arr[1]
        }

        # Выводим красивый результат, только если нашли и название, и хеш
        if (title != "" && hash != "") {
            print "📁 Название: " title
            print "🔑 Хеш:     " hash
            print "🧲 Magnet:   magnet:?xt=urn:btih:" hash
            print "----------------------------------------------------------------"
        }
    }
}' "$path_to_rutracker_xml"
Если у тебя WSL - этот скрипт можно запускать.
Если у тебя обычная Windows без WSL он не заработает

Вот нормальный рабочий скрипт специально для WSL (и Linux).Он правильно извлекает:

Название раздачи
Хеш
Готовую magnet-ссылку

Код:
#!/bin/bash

# Проверка аргумента
if [ -z "$1" ]; then
    echo "❌ Ошибка: Не указан поисковый запрос"
    echo "💡 Использование: $0 \"ключевые слова\""
    echo "   Пример: $0 \"matrix 1999\""
    exit 1
fi

search_query="$1"

# ====================== НАСТРОЙКА ======================
# Укажи сюда путь к своему XML-файлу (пример для WSL)
path_to_rutracker_xml="/mnt/c/Users/ВашеИмя/Downloads/rutracker.xml"
# =======================================================

if [ ! -f "$path_to_rutracker_xml" ]; then
    echo "❌ Файл не найден: $path_to_rutracker_xml"
    echo "Открой скрипт и укажи правильный путь."
    exit 1
fi

echo "🔍 Ищем: \"$search_query\""
echo "================================================================"

gawk -v IGNORECASE=1 -v RS="</torrent>" -v query="$search_query" '
BEGIN {
    n = split(query, words, " ")
}

$0 !~ /<torrent/ { next }

{
    found = 1
    for (i = 1; i <= n; i++) {
        if ($0 !~ words[i]) {
            found = 0
            break
        }
    }

    if (found) {
        title = ""
        if (match($0, /<title>[^<]+<\/title>/)) {
            title = substr($0, RSTART + 7, RLENGTH - 15)
        }

        hash = ""
        if (match($0, /hash="([A-Fa-f0-9]{40})"/, arr)) {
            hash = arr[1]
        }

        if (title != "" && hash != "") {
            print "📁 Название: " title
            print "🔑 Хеш:     " hash
            print "🧲 Magnet:   magnet:?xt=urn:btih:" hash
            print "----------------------------------------------------------------"
        }
    }
}' "$path_to_rutracker_xml"
Как пользоваться в WSL:

1 Создай файл:

bash

nano search.bash

2 Вставь код выше.
3 Исправь путь к XML-файлу.
4 Сохрани (Ctrl+O → Enter → Ctrl+X).
5 Дай права:

bash

chmod +x search.bash

6 Запускай:

bash

./search.bash "matrix 1999"
__________________
О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас.
--Омар Хайям

Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.

Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
Дмитрий вне форума   Ответить с цитированием