从列表中的每个链接创建文本文件?

从列表中的每个链接创建文本文件?

我有一个包含如下链接的文件:

http://domain.com/file_name1.mkv
http://domain.com/file_name2.mkv
http://domain.com/file_name3.mkv

... 等等。

我想为每个链接创建一个扩展名为 .strm 的文件,并且每个文件都有文件名并包含该文件的链接。因此,对于第一个链接,第一个文件名将为 file_name1.strm 并包含第一个链接,对于第二个链接,文件名将为 file_name2.strm 并将包含第二个链接,依此类推。我怎样才能做到这一点?

我有一个命令正在做一些接近的事情,但它只创建具有文件中单词名称的文件:

sed -e 's/$/.strm/' file | xargs -d '\n' touch

答案1

详细说明你的xargs尝试

xargs -L1 sh -c 'f="${0##*/}"; printf "%s\n" "$0" > "${f%.*}.strm"' < file

第一个替换f="${0##*/}"会删除 URL 的路径组成部分,而第二个替换"${f%.*}.strm"会删除并替换扩展名。

前任。

$ xargs -L1 sh -c 'f=${0##*/}; printf "%s\n" "$0" > "${f%.*}.strm"' < file
$ head *.strm
==> file_name1.strm <==
http://domain.com/file_name1.mkv

==> file_name2.strm <==
http://domain.com/file_name2.mkv

==> file_name3.strm <==
http://domain.com/file_name3.mkv

答案2

我将尝试恢复@Erwan 提出的纯bash 解决方案:

while IFS= read -r link; do
    filename="${link##*/}"
    echo "$link" > "${filename%.mkv}.strm"
done < file
  1. https://unix.stackexchange.com/a/209184/230365解释为什么应该使用它IFS= read -r来读取一行
  2. ${var##<pattern>}替换具有与删除的最长前缀匹配的变量。请参阅 bash(1) 中“参数扩展”部分中的“删除匹配的前缀模式”。还有很多其他有用的参数扩展修饰符
  3. ${var%<pattern>}用与删除的最短后缀匹配的变量替换(“删除匹配的后缀模式”)

答案3

编辑以修复评论中提到的错误,但贝尔卡的答案是该解决方案的更好版本。

下面file逐行阅读链接。每个链接都写入一个文件,该文件以链接的基本名称后跟所需的结尾命名。

while read link; do
   echo "$link" >$(basename "${link%.mkv}").strm
done <file

与单衬相同:

cat file | while read link; do echo "$link" >$(basename "${link%.mkv}").strm; done

相关内容