今回は、エクセルで作成された画像リストとディレクトリ内にある画像の比較をLinuxコマンドで行う方法を書き留めておきたいと思います。
【状況】
エクセルで作成された画像リスト「image_list.xlsx」と画像ファイルが置かれたディレクトリ「image」があります。
画像リスト「image_list.xlsx」にはあるがディレクトリ「image」に画像ファイルのない画像はなにかを知りたい状況です。
【内容】
<画像リスト「image_list.xlsx」の記載>
hoge01.jpg
hoge02.jpg
hoge03.jpg
hoge05.jpg
hoge06.jpg
hoge07.jpg
hoge08.jpg
hoge09.jpg
hoge10.jpg
hoge11.jpg
hoge12.jpg
hoge13.jpg
hoge14.jpg
hoge15.jpg
<ディレクトリ「image」内の画像ファイル>
hoge01.jpg
hoge02.jpg
hoge04.jpg
【コマンド】
ディレクトリ「image」の画像ファイルを確認します。
$ ls image/
hoge01.jpg hoge02.jpg hoge04.jpg
ディレクトリ「image」の画像ファイルの一覧をソートしてテキスト「image.txt」へ出力します。
$ ls image | sort > image.txt
テキスト「image.txt」が作成されたことを確認します。
$ ls
image image.txt
既に手元にあるエクセルで作成された画像リスト「image_list.xlsx」はバイナリファイルであるため、また、改行コードが入るため、このままでは、上記で作成した「image.txt」と比較できません。
そのため、「image_list.xlsx」のリスト部分をコピーして作成したテキスト「image_list.txt」を作成し、そこに貼り付けます。
$ vim image_list.txt
テキスト「image_list.txt」が作成されたことを確認します。
$ ls
image image.txt image_list.txt
2つのテキストファイル「image.txt」「image_list.txt」の差を出力します。
これで、「image.txt」にあって、「image_list.txt」にないものが下記であることが分かりました。
< hoge04.jpg
また、「image_list.txt」にあって、「image.txt」にないものが下記であることが分かりました。
> hoge03.jpg
> hoge05.jpg
> hoge06.jpg
> hoge07.jpg
> hoge08.jpg
> hoge09.jpg
> hoge10.jpg
> hoge11.jpg
> hoge12.jpg
> hoge13.jpg
> hoge14.jpg
> hoge15.jpg
$ diff image.txt image_list.txt
3c3,15
< hoge04.jpg
---
> hoge03.jpg
> hoge05.jpg
> hoge06.jpg
> hoge07.jpg
> hoge08.jpg
> hoge09.jpg
> hoge10.jpg
> hoge11.jpg
> hoge12.jpg
> hoge13.jpg
> hoge14.jpg
> hoge15.jpg
>
画像リスト「image_list.xlsx」にはあるがディレクトリ「image」に画像ファイルのない画像のリストを作成するのが目的でしたので「>」で始まる行を抽出して(grep -i '^>')しました。
また、ファイル名の先頭にある「>」は必要ないので除去しました(sed -e 's/> //g')。
$ diff image.txt image_list.txt|grep -i '^>'|sed -e 's/> //g'
hoge03.jpg
hoge05.jpg
hoge06.jpg
hoge07.jpg
hoge08.jpg
hoge09.jpg
hoge10.jpg
hoge11.jpg
hoge12.jpg
hoge13.jpg
hoge14.jpg
hoge15.jpg
これで、画像リスト「image_list.xlsx」にはあるがディレクトリ「image」に画像ファイルのない画像のリストが作成できました。
一つ一つのコマンドは知っていても組み合わせて使うとどのようなことができるのかはなかなか気づきづらいところです。
以上です!