我有一个包含如下链接的文件:
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
- 看https://unix.stackexchange.com/a/209184/230365解释为什么应该使用它
IFS= read -r
来读取一行 ${var##<pattern>}
替换具有与删除的最长前缀匹配的变量。请参阅 bash(1) 中“参数扩展”部分中的“删除匹配的前缀模式”。还有很多其他有用的参数扩展修饰符${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