Script do scanner de mídia

0

Eu sou um iniciante em scripts Bash. Eu tenho trabalhado recentemente em um script para endurecer computadores Ubuntu para um projeto escolar. Tudo está indo bem, exceto que os alunos não têm permissão para usar nenhum arquivo de mídia (.mp3, .mov, etc), e não tenho certeza de como fazer isso. Que comando (s) eu usaria? grep Eu tenho pesquisado isso por algumas horas agora sem sorte. Não precisa ser longo. Tudo o que preciso é um exemplo e posso copiá-lo para extensões diferentes. Eu preciso que seja capaz de fazer o seguinte:

  • Encontrar arquivos de mídia
  • Enviar caminhos de arquivo para um arquivo de texto
  • notificar vários arquivos de mídia encontrados

Por exemplo, estou procurando por algo como:

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

Qualquer ajuda é muito apreciada!

    
por Captain Cucumber 18.11.2014 / 20:07

2 respostas

1

Para encontrar arquivos de um determinado tipo, eu não procuraria pela extensão do arquivo. Eu prefiro digitalizar arquivos para o tipo MIME usando uma combinação de find e file . Esta saída pode então ser grep ed para o mimetypesm desejado, por ex. audio/* e video/* .

Eu criei um pequeno script para fazer isso:

#!/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"

Note que eu uso o RegExp completo com o grep. Para adicionar alguns tipos de MIME, construa-os da mesma forma como fiz com os dois já incluídos: (type/enc;) e adicione-os com um RegExp OR ( | ).

PS: Como está, o script opera no diretório atual. Se você quiser torná-lo mais flexível, adicione um $1 entre find e o seguinte. Agora, execute o script e forneça o caminho para pesquisar como argumento.

    
por s3lph 18.11.2014 / 20:40
1

Definitivamente uma opção mais detalhada (python) que procura por mimetype (s) usando o comando file . É uma versão editada / reescrita de esta , apropriada para o seu propósito.

O que faz

Quando os arquivos são encontrados
ele retorna uma mensagem (no terminal):

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

enquanto um arquivo de texto é gravado no diretório / nome que você definiu na seção head do script

ou, se nada for encontrado :

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

Como usar

Copie o script abaixo em um arquivo vazio, edite as três linhas na seção head do script:

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"

salve-o como find_media.py e execute-o em uma janela de terminal pelo comando:

python3 /path/to/find_media.py

O script:

#!/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()
    
por Jacob Vlijm 18.11.2014 / 23:08