sort と uniq で出来ること

動画ホスティングサイトから条件に合うものを丸ごとダウンロードしたいということがある。

適当なスクリプトでまず対象を絞り込んで動画 ID のリストを list.txt というファイル名で作成したらこんな感じだったとしよう。

ID001
ID002
ID003
ID004
ID005

そして実際にダウンロードするが、何らかの事情で三個目で中断した。

このときファイル名は「ID」「タイトル」「拡張子」から成るものとする。 ダウンロード済みのファイル名リストを作るのは簡単だ。 ls コマンドを使えばいい。

$ ls *.mp4 *.flv
ID001 ぬこパンチ.mp4
ID002 雪の日のぬこ.flv
ID003 俺のぬこがこんなに可愛いわけがない.mp4

では、まだダウンロードしていない動画のリストを作るにはどうすればよいだろうか。

ダウンロード済みのリストと list.txt とをくっつけて一度しか出現しないものを抜き出せばよいのである。

$ ls *.mp4 *.flv |gawk '{print $1;}' |cat - list.txt |sort |uniq -u >todo.txt
$ cat todo.txt
ID004
ID005

これで万事解決というわけではない。 ダウンロードしている間にも動画ホスティングサービスにはどんどん投稿され、削除されることもある。 list.txt を作り直すとこんな感じになったとする。

ID001
ID002
ID004
ID005
ID006

ID003 が削除されて ID006 が追加されている。

この状態で上記のやり方でまだダウンロードしていないリストを作るとどうなるか。

$ ls *.mp4 *.flv |gawk '{print $1;}' |cat - list.txt |sort |uniq -u >todo.txt
$ cat todo.txt
ID003
ID004
ID005
ID006

ID003 はダウンロード済みであるにもかかわらずこのリストに現れてしまうのである。

Document ID: faf0085744477f20750c997e764618d5