リスト内の各リンクからテキストファイルを生成しますか?

リスト内の各リンクからテキストファイルを生成しますか?

次のリンクを含むファイルがあります。

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

...など。

各リンクごとに.strm拡張子を持つファイルを作成し、各ファイルにファイル名を持ち、そのファイルへのリンクを含めたいと思います。したがって、最初のリンクの場合、最初のファイル名はfile_name1.strmになり、最初のリンクを含み、2番目のリンクの場合、ファイル名はfile_name2.strmになり、2番目のリンクを含む式です。どうすればいいですか?

近い操作を実行するコマンドがありますが、ファイル内の単語名でのみファイルを生成します。

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のパスコンポーネントを削除し、2番目の置換は"${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/230365IFS= read -r1行を読むときに使用する理由を説明してください。
  2. ${var##<pattern>}変数を削除された最長の接頭辞の一致に置き換えます。 bash(1)の「パラメータ拡張」セクションの「一致するプレフィックスパターンの削除」を参照してください。他の便利なパラメータ拡張修飾子がたくさんあります。
  3. ${var%<pattern>}削除された最短サフィックスに一致する変数に置き換える(「一致するサフィックスパターンを削除する」)

答え3

コメントに記載されているバグを修正するために編集されましたが、Belkaの答えはより良いソリューションバージョンです。

以下のfileリンクを1行ずつ読んでください。各リンクは、リンクのデフォルト名と目的の末尾の名前のファイルに書き込まれます。

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

関連情報