
名前付きのファイルの大きなリストがあります(ビデオ)
ファイル名をすべてテキストファイルに書き込むことができました。これで、たくさんのファイル名(1行に1エピソード)が入ったテキストファイルができあがりました。今度は、そのテキストファイルを読み取って、どのエピソードE
番号が欠けているかを教えてくれるものが必要です。
S1-E18-(Date)-(Title)-(Random numbers).mp4
リストの例は次のとおりです
S1-E1-20100526-title-of-video-1400316375.mp4
S1-E3-20100517-title-of-video-15457547.mp4
S10-E5-20100421-title-of-video-14467457.mp4
S5-E7-20120912-title-of-video-17467457.mp4
この場合、ファイルが不足していることは簡単にわかりますS1-E2
。S10-E4
しかし、リストが大きい場合、不足しているファイルを見つけるにはどうすればよいのでしょうか。(シーズン番号を残しますS1, S2
) 確認する必要があるE
のはエピソード番号だけです。
既存のファイルの最大番号は でありS50-E2184
、既存のファイルの最小番号はS1-E1
答え1
すべての名前を「file_with_list_of_files」という名前のファイルに保存し、Linux/Unix ターミナルで以下のコマンドを実行します [私は Mac ターミナルで試しました]。
cat file_with_list_of_files | sed 's/^[A-Z][0-9]*-//g' | grep -v "^E"
- または -
cat file_with_list_of_files | awk -F- '{print $2}' | grep -v "^E"
これは、最初の - (ハイフン) の後に E が付いていないファイル名をすべてリストします。他にももっと良い方法が見つかるかもしれません。
答え2
すべてのエピソードの署名を含むファイルを準備します。各シーズンにエピソードがいくつあるかは教えてくれませんでしたが、当然知っておく必要があります。ファイルの準備方法は次のとおりです。
>all_episodes # just to empty the file which may or may not exist printf 'S1-E%s\n' {1..3} >>all_episodes # 3 episodes in season 1 printf 'S2-E%s\n' {1..5} >>all_episodes # 5 episodes in season 2 printf 'S3-E%s\n' {1..8} >>all_episodes # and so on printf 'S50-E%s\n' {1..2184} >>all_episodes
これは、各シーズンが独自のエピソード番号 1 から始まることを前提としています (質問ではこの点が明確ではありません)。ファイルは、
S<n>-E<m>
たとえば という形式の行で構成されますS2-E3
。同じ形式で所有エピソードのファイルを作成します。
cut -d - -f -2 your_current_list >owned_episodes
コマンドは
-
、d区切り文字と、ふ現在のリストからフィールド番号 2 を選択します。owned_episodes
パターンとして扱い、all_episodes
パターンのない行を見つけるためにフィルタリングします。grep -vxFf owned_episodes all_episodes
ここで使用することに注意してください
-x
。ポイントはS50-E3
一致してはならないということですS50-E31
。-F
あなたの場合は必要ありませんが、一般的に固定文字列を供給するときに使用する必要があります。オプションは:-F
固定文字列を使用して一致します。指定された各パターンを正規表現ではなく文字列として扱います。 [...]-f pattern_file
パス名で指定されたファイルから 1 つ以上のパターンを読み取りますpattern_file
。 [...]-v
指定されたパターンのいずれにも一致しない行を選択します。 [...]-x
<newline>
固定文字列または正規表現全体に一致するように 行末を除くすべての文字を使用する入力行のみを一致行と見なします。