Linux: определяем тип файла

2018-04-28-22:37:39_718x635

В попытках открыть csv-файл от одной организации я увидел картину из скриншота. В файле должны были быть табличные данные, а оказалась какая-то белиберда с отсылкой к VBA. Очевидно, что там что-то из msоffice, но как узнать это точно?

Для определения типа файла по его сигнатуре в unix-подобных операционных системах существует утилита file (man 1 file).

 $ file test.csv  
test.csv: Composite Document File V2 Document, Little Endian, Os: Windows, Version 5.2, Code page: 1251, Author: , Last Saved By: , Name of Creating Application: Microsoft Excel, Create Time/Date: Sat Apr 28 10:33:01 2018, Last Saved Time/Date: Sat Apr 28 10:45:37 2018, Security: 0

Видно, что тип файла Composite Document File V2 Document. Но какой именно это формат? У экселя их очень много. Есть отличная утилита unoconv из поставки openoffice/libreoffice.

 $ sudo dnf install unoconv
 $ mv test.csv test  
$ unoconv --format=ods test

Сразу возникает вопрос: зачем мы убрали у файла расширение? Это особенность утилиты: она использует расширение файла для определения типа, а если расширения нет, то опирается на метаинформацию. Поэтому нам потребовалось убрать расширение.

Теперь все хорошо и нормально открывается.