在将参数传递给命令之前重写参数

在将参数传递给命令之前重写参数

我用rtorrent。使用磁力链接时,它会创建一个“元”文件 (.meta)。它采用长十六进制数(0-9,AF)的形式。例如:

0123456789ABCDEF0123456.meta

要“使用”现有元文件来启动rtorrent,您可以首先“隔离”不带后缀的文件名(不带“.meta”)。

0123456789ABCDEF0123456

这个十六进制数字部分实际上(总是?)41 个字符长。

然后,您必须在其之前添加协议,并在其后添加跟踪器列表。

magnet:?xt=urn:btih:0123456789ABCDEF0123456&tr=http://tracker1.com:80&tr=udp://tracker2.net:8080

如果可以更改跟踪器列表,那就太好了。理想情况下,跟踪器的 URL 应从每行一个跟踪器的文件中读取 -&tr=在需要的地方添加。跟踪器使用 http:// 或 udp:// 作为协议,并且通常必须指定端口号(在:port末尾)。

一个例子实际的“tracker-tail”(十六进制数后面的部分)可以是:

&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A80&tr=udp%3A%2F%2Fglotorrents.pw%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969

然而,必须可以更改这些,并且理想情况下它们应该列在单独的文件中。

例如,这样的文件可以包含:

trackers.txt:

udp://tracker.coppersurfer.tk:80
udp://glotorrents.pw:6969/announce
udp://tracker.leechers-paradise.org:6969
udp://tracker.opentrackr.org:1337/announce
udp://exodus.desync.com:6969

(注意:Trackers 也使用 http:// 作为协议)

.meta"=删除并添加magnet:...and &tr=...- 在引号中以确保&不会混淆-之后的结果bash可以作为参数传递给 rtorrent。


我想要的是一个可以自动执行此转换过程并将结果传递给rtorrent.最好是可以采用多个元文件作为参数(例如从bash*.meta 扩展),并将它们全部(转换后)作为参数传递给一个rtorrent实例(脚本启动的实例)。

rtorrent "magnet:...12345..." "magnet:...6789..." "magnet:...ABCD..."

不幸的是,我真的不擅长编写bash脚本,所以这里有人知道如何完成这样的事情吗?

答案1

这是在 bash 中进行转换的片段。

#!/bin/bash

# The array of results passed to rtorrent in the end
results=()

# The file listing the trackers is the first argument
trackers="$1"
shift
# create the tracker list url part.
# sed reads the file and puts '&tr=' before each line,
# then it replaces all : and / with the percent escaped version for urls.
# tr deletes all newlines (turning the text into one long line)
tracker_list_for_url="$(sed 's/^/&tr=/;s/:/%3A/g;s#/#%2F#g' < "$trackers" \
                        | tr -d '\n')"

# loop over arguments and add them to $results
for arg in "$@"; do
  # remove the extension
  hex_part="${arg%.meta}"
  # append to results array
  results+="magnet:?xt=urn:btih:$hex_part$tracker_list_for_url"
done
exec rtorrent "${results[@]}"

我还不明白您的场景中的哪个程序调用哪个程序以及何时以及如何创建参数并将其传递给其他程序。所以我做了这些假设:

  1. 您使用跟踪器列表文件作为第一个参数和元文件作为其余参数来调用脚本
  2. 你的脚本应该开始rtorrent

如果这些假设是错误的,请澄清或使用上面的脚本并根据您的需要采用它。

相关内容