Как связать команду mimetype -b и find, чтобы получить имена файлов и тип файла в одном и том же csv? - PullRequest
2 голосов
/ 08 июля 2020

Я хотел бы получить имена файлов, даты создания, даты модификации и mime-типы файлов из структуры каталогов. Я написал сценарий, который выглядит следующим образом:

#!/bin/bash
output="file_list.csv"

## columns
echo '"File name";"Creation date";"Modification date";"Mime type"' > $output

## content
find $1 -type f -printf '"%f";"%Tc";"%Cc";"no idea!"\n' >> $output

, который дает мне обнадеживающие результаты:

"File name";"Creation date";"Modification date";"Mime type"
"Exercice 4 Cluster.xlsx";"ven. 27 mars 2020 10:35:46 CET";"mar. 17 mars 2020 19:14:18 CET";"no idea!"
"Exercice 5 Bayes.xlsx";"ven. 27 mars 2020 10:36:30 CET";"ven. 20 mars 2020 16:18:54 CET";"no idea!"
"Exercice 3 Régression.xlsx";"ven. 27 mars 2020 10:36:46 CET";"mer. 28 août 2019 17:21:10 CEST";"no idea!"
"Archers et Clustering.xlsx";"ven. 27 mars 2020 10:37:34 CET";"lun. 16 mars 2020 14:12:05 CET";"no idea!"
...

, но мне не хватает одной важной вещи: как мне получить файлы пантомимы? Было бы здорово, если бы я мог связать команду mimetype -b с каждым найденным файлом с командой find и записать ее в удобную колонку.

Заранее спасибо,

Кирилл

Ответы [ 2 ]

3 голосов
/ 13 июля 2020

Вы можете попробовать использовать параметр -exec команды find, в котором квадратные скобки {} представляют имя текущего файла.

Затем вы можете удалить новая строка при добавлении в существующий файл: поведение AFAIK по умолчанию автоматически добавляет новый контент в новую строку, поэтому \n не требуется.

Наконец, вы хотите иметь заключительную кавычку после вашего mimetype, поэтому вам следует использовать не только параметр -b, но и параметр --output-format, который даст вам больше контроля над тем, что вы хотите отобразить. Следовательно, третья команда вашего скрипта должна выглядеть так:

find $1 -type f -printf '"%f";"%Tc";"%Cc";"' -exec mimetype --output-format %m\" {} \; >> $output
2 голосов
/ 14 июля 2020

Это то, что я придумал:

for entry in *; do stat --printf='"%n";"%z";"%y";"' $entry; file -00 --mime-type $entry | cut -d $'\0' -f2; echo '"'; done

Использует оболочку "для l oop", чтобы выполнить stat записи каталога в текущем каталоге. Затем использует file для получения типа mime и направляет его в cut, чтобы получить только тип mime (исключая имя файла, которое также печатается file).

Формат для stat - это то, что, как мне кажется, было запрошено - имя файла, дата последнего изменения, дата последнего изменения (оба в формате ISO, но могут легко быть преобразованы в UNIX секунд с начала эпохи с помощью верхнего регистра Z и Y ).

Доступность:

  • file: возможно, отдельный пакет, если вы используете Linux? Но я предполагаю, что он должен быть предустановлен на macOS.
  • bash/zsh: легко доступен как на Linux, так и на macOS.
  • stat и cut: часть coreutils поэтому должен быть предварительно установлен в большинстве систем.
...