次のリンクを含むファイルがあります。
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
- バラよりhttps://unix.stackexchange.com/a/209184/230365
IFS= read -r
1行を読むときに使用する理由を説明してください。 ${var##<pattern>}
変数を削除された最長の接頭辞の一致に置き換えます。 bash(1)の「パラメータ拡張」セクションの「一致するプレフィックスパターンの削除」を参照してください。他の便利なパラメータ拡張修飾子がたくさんあります。${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