Код:
#!/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"