私のPlexメディアサーバーにEnigma2 FreeSatレコーダーが接続されています。
PlexはEnigma2でファイルを表示して再生するのにはうまく機能しますが、ファイルの命名のため魅力的ではありません。
この形式でファイル名を変更するには:
yyyymmdd nnnn - channel - title.*
たとえば、20181128 2100 - BBC One HD - The Apprenticeです。 *
到着する:
title - dd-mm-yyyy - channel.*
たとえば、The Apprentice - 2018年11月28日 - BBC One HD。 *
(したがって、コマンドラインから数分ごとに実行できます)。
すでに名前が変更されたファイルの名前を変更しようとしないように、最初の形式のファイルのみが一致していることを確認したいと思います。
後でDockerコンテナとして実行したいと思います。
答え1
次のシェルスクリプトがこれを実行できると思います。
元のファイル名の日付と時刻が数値であることを確認し、そうである場合は、名前を目的の形式に並べ替えます。
それ以外の場合はファイルをスキップするため、すでに変更されているファイルには触れません。
ディレクトリをファイルの場所に変更し、スクリプトを実行します。
#!/bin/bash
re='^[0-9]+$'
for i in *.*
do
str="$i"
# echo "${str} -----"
date=${str:0:8}
time=${str:9:4}
if [[ $date =~ $re ]] && [[ $time =~ $re ]]
then
channel=${i#*- }
channel=${channel% -*}
title=${i##*- }
ext=${title##*.}
title=${title%%.*}
date=${date:6:2}-${date:4:2}-${date:0:4}
mv -nv "$i" "$title - $date - $channel.$ext"
fi
done
答え2
これを出発点として使用できます。
#!/bin/bash
regexp='^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] -'
while read l; do
[[ ! ${l} =~ ${regexp} ]] && continue
ext=${l##*.}
yyyymmdd=${l%% *}
yyyymmdd="${yyyymmdd:6:2}-${yyyymmdd:4:2}-${yyyymmdd:0:4}"
channel=$(echo ${l} | awk -F- '{print $2}' | sed -e 's!^[[:space:]]*!!' -e 's![[:space:]]*$!!')
title=$(echo ${l} | awk -F- '{print $NF}' | sed -e 's!^[[:space:]]*!!' -e 's![[:space:]]*$!!')
title=${title%.*}
echo "${title} - ${yyyymmdd} - ${channel}.${ext}"
done
exit 0
これにより、正規表現が "yyyymmdd nnnn -"に設定され、その文字列と一致しないすべての項目をフィルタリングできます。次に、読み取る各行(find(1)、ls(1)などの出力である可能性があります)に対して正規表現が一致することを確認します。その場合は、次の行にジャンプしてください。
次の変数割り当てセットを使用して、必要なさまざまなコンポーネントを取得できます。拡張割り当ては、ファイル拡張子をインポートすることです。 yyyymmddは年、月、日を取得します。次に、変更可能なサブストリングを使用して書式を再指定します。
チャンネルとタイトルはダッシュで区切られているので、awk(1)を使用して適切なフィールドを取得する方が簡単になると思いました。次のsedは、文字列の前後のすべてのスペースを切り取ります。最後のタイトルはファイル拡張子を削除することです。
すべての変数を取得したら、その行を印刷します。これは次のように簡単に置き換えることができます。
mv ${l} "${title} - ${yyyymmdd} - ${channel}.${ext}"
ファイルの名前を変更します。