Como encontro vários tipos de arquivos em uma pesquisa?

2

Eu tenho feito muitas pesquisas sobre isso, mas não consigo encontrar uma resposta que satisfaça minhas necessidades. Eu quero uma maneira simples de procurar por dois tipos de arquivo ou mais (por exemplo, * .mp3, * .aac, * .pdf, etcetera.) Eu entendo que o comando encontrar faz isso através de pesquisas de terminal, mas eu quero um programa com uma GUI para essa necessidade em particular. Eu tentei a busca interna do Nemo File Manager, o mesmo vale para Caja, PCManFM e outros. Eu também experimentei bagre e searchmonkey. Eu simplesmente não consigo obter nenhum resultado produtivo. Qualquer ajuda é muito apreciada. Desde já, obrigado.

    
por crypto 15.08.2016 / 01:17

1 resposta

0

A menos que você realmente precise da velocidade de C, eu recomendaria uma linguagem de script (Ruby, Python ou similar). Você poderá fazer tarefas sofisticadas sem o tédio de C (sem chamas, por favor).

Veja o que eu faria:

  • Use a interface Python-GTK para criar a GUI: Você só precisa de 4 widgets: A Gtk.Window, uma Gtk.VBox (para armazenar os próximos dois itens), A Gtk.Entry para inserir os tipos de arquivo e um Gtk.TreeView para mostrar os resultados

  • Do Python, você pode combinar facilmente a lista do Gtk.Entry e o comando find + opções + tipos de arquivo, para obter a lista. (Você pode executar o comando find de subprocess.checkcall ).

Checkcall retorna a lista, que você pode mostrar no Gtk.TreeView.

Se você gostaria de aprender Python, existem excelentes tutoriais sobre o 'net. Isso é o tutorial oficial no site do Python . O site learnPython é muito interessante, pois você pode até experimentar seus programas. Este tutorial deve fornecer tudo o que você precisa para usar a GUI coisas em Python com muitos exemplos.

Uma linguagem de script como o Python é ideal para resolver problemas como o que você descreve.

EDIT Eu tive algum tempo e pensei que não seria ruim ter um localizador de GUI compacto. Abaixo está um código de trabalho. Sim, tem mais de 20 linhas, principalmente porque construí toda a GUI no código. Se eu usasse o Glade (um designer de GUI), o código seria reduzido pela metade. Além disso, adicionei uma caixa de diálogo para selecionar a raiz da pesquisa.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
#  test_finder.py
#  
#  Copyright 2016 John Coppens <[email protected]>
#  
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#  
#  


from gi.repository import Gtk
import os, fnmatch

class MainWindow(Gtk.Window):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.connect("destroy", lambda x: Gtk.main_quit())
        self.set_size_request(600, 400)

        vbox = Gtk.VBox()
        # Pattern entry
        self.entry = Gtk.Entry()
        self.entry.connect("activate", self.can't open file 'pyfind.py'on_entry_activated)

        # Initial path selection
        self.path = Gtk.FileChooserButton(title = "Select start path",
                                          action = Gtk.FileChooserAction.SELECT_FOLDER)
        self.path.set_current_folder(".")

        # The file list + a scroll window
        self.list = self.make_file_list()
        scrw = Gtk.ScrolledWindow()
        scrw.add(self.list)

        vbox.pack_start(self.entry, False, False, 0)
        vbox.pack_start(self.path, False, False, 0)
        vbox.pack_start(scrw, True, True, 0)

        self.add(vbox)
        self.show_all()

    def make_file_list(self):
        self.store = Gtk.ListStore(str, str)
        filelist = Gtk.TreeView(model = self.store, enable_grid_lines = True)

        renderer = Gtk.CellRendererText()
        col = Gtk.TreeViewColumn("Files:", renderer, text = 0, sizing = Gtk.TreeViewColumnSizing.AUTOSIZE)
        filelist.append_column(col)
        col = Gtk.TreeViewColumn("Path:", renderer, text = 1)
        filelist.append_column(col)

        return filelist

    def on_entry_activated(self, entry):
        self.store.clear()
        patterns = entry.get_text().split()
        path = self.path.get_filename()

        for root, dirs, files in os.walk(path):
            for name in files:
                for pat in patterns:
                    if fnmatch.fnmatch(name, pat):
                        self.store.append((name, root))

    def run(self):
        Gtk.main()


def main(args):
    mainwdw = MainWindow()
    mainwdw.run()

    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

Manual:

  1. Verifique se você tem o Python3 instalado ( python -V ). Se não, instale-o.
  2. Salve o programa acima como, por exemplo, pyfind.py
  3. Torne-o executável chmod 755 pyfind.py
  4. Execute com ./pyfind.py
  5. Digite o filtro e pressione Enter.
  6. Se você alterar o caminho, repita 1 (pode evitar isso usando um sinal do FileChooserButton, se desejado)

EDIT2

Não sei ao certo o que está acontecendo no seu caso, mas o log diz que o python3 não está localizando o arquivo pyfind.py. Você pode tornar o arquivo diretamente executável:

Altere a primeira linha do código para:

#!/usr/local/bin/python3

Para tornar o arquivo acima executável, faça (em uma janela de terminal, no diretório onde pyfind.py está):

chmod 755 pyfind.py

Você deve então ser capaz de executar o programa simplesmente assim (novamente, no terminal):

./pyfind.py
    
por 15.08.2016 / 06:20