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
, Этот вывод может быть grep
Ed для желаемого 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()