Media Scanner Script

Я новичок в написании сценариев Bash. Недавно я работал над сценарием, чтобы укрепить компьютеры Ubuntu для школьного проекта. Все идет хорошо, за исключением того, что студентам не разрешается использовать какие-либо медиа-файлы (.mp3, .mov и т. Д.), И я не уверен, как это сделать. Какие команды я бы использовал? Grep? Я исследовал это в течение пары часов без удачи. Это не должно быть долго. Все, что мне нужно, это пример, и я могу скопировать его для разных расширений. Мне нужно, чтобы я мог сделать следующее:

  • Найти медиа-файлы
  • Отправить пути к файлу в текстовый файл
  • уведомить несколько найденных медиа-файлов

Например, я ищу его для вывода что-то вроде этого:

Searching for media files... 5 media files found! Details can be found in 'media.txt'

Любая помощь с благодарностью!

2 ответа

Чтобы найти файлы определенного типа, я бы не стал искать расширение файла. Я бы предпочел сканировать файлы на их MIME-тип, используя комбинацию find а также file, Этот вывод может быть grepEd для желаемого mimetypesm, например, audio/* а также video/*,

Я создал небольшой скрипт для этого:

#!/usr/bin/env bash
#Don't know whether you want to do so, but this deletes a existing media.txt
rm media.txt
#Find files of desired MIME types and store them in $list
list=$(find | file -if - | grep -P "(audio/.*?;)|(video/.*?;)")
n=0
#Iterate over each line in the list (one file per line)
while read -r line; do
    #Append the filename to media.txt
    echo "$line" | cut -f1 >> media.txt
    #Increase file counter
    n=$(($n+1))
done <<< "$list"
#Output the result
echo "$n media files found! Saved to media.txt"

Обратите внимание, что я использую полный RegExp с grep. Чтобы добавить некоторые типы MIME, создайте их так же, как я сделал с двумя уже включенными: (type/enc;) и добавить их с помощью RegExp ИЛИ (|).

PS: как есть, скрипт работает в текущем каталоге. Если вы хотите сделать его более гибким, добавьте $1 между find и следующая труба. Теперь запустите скрипт и укажите путь для поиска в качестве аргумента.

Определенно более подробный вариант (python), который ищет mimetype(s), используя file команда. Это отредактированная / переписанная версия этой, приспособленная для ваших целей.

Что оно делает

Когда файлы найдены
возвращает сообщение (в терминале):

checking for filetypes: image, video, audio...
4 media files found. See for details:  /home/jacob/Bureaublad/found.txt

в то время как текстовый файл записывается в каталог / имя, которое вы определили в разделе заголовка скрипта

или, если ничего не найдено:

checking for filetypes: image, video, audio...
no files found

Как пользоваться

Скопируйте приведенный ниже скрипт в пустой файл и отредактируйте три строки в разделе заголовка скрипта:

source_dir = "/path/to/directory"
filetypes = ("image", "video", "audio") # you might want to leave this line as it is, used by the file command
report = "/path/to/report.txt"

сохранить как find_media.pyи запустите его в окне терминала командой:

python3 /path/to/find_media.py

Сценарий:

#!/usr/bin/env python3

import os
import subprocess
# ---
source_dir = "/path/to/directory"
filetypes = ("image", "video", "audio")
report = "/path/to/report.txt"
# ---
print("checking for filetypes: "+(", ").join(filetypes)+"."*3)
found = []

def look_for():
    for root, dirs, files in os.walk(source_dir):
        for name in files:
            file = root+"/"+name
            ftype = subprocess.check_output(
                ['file', '--mime-type', '-b', file]
                ).decode('utf-8').strip()
            if ftype.split("/")[0] in filetypes:
                found.append(file)
    found_files = len(found)
    if found_files != 0:
        print(str(found_files), "media files found. See for details: ", report)
        with open(report, "wt") as out:
            for item in found:
                out.write(item+"\n")
    else:
        print("no files found")

look_for()
Другие вопросы по тегам