Shell-Script

在將參數傳遞給命令之前重寫參數

  • March 16, 2016

我用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=在需要的地方添加。Trackers 使用 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:...&tr=...- 在引號中以確保&不會混淆bash- 然後可以作為參數傳遞給 rtorrent。


我想要的是一個可以自動化這個轉換過程的腳本,並將結果傳遞給rtorrent. 最好是可以將多個元文件作為參數(例如,bash從 *.meta 擴展),並將它們全部 - 轉換 - 作為參數傳遞給一個rtorrent實例(腳本啟動)。

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

不幸的是,我真的bash不擅長編寫腳本,所以這裡有人知道如何完成這樣的事情嗎?

這是一個在 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

如果這些假設是錯誤的,請澄清或使用上述腳本並根據您的需要採用它。

引用自:https://unix.stackexchange.com/questions/270161