BulGoblin (BETA) | Linux için Özgür, Hızlı ve Hafif Dosya Bulucusu

BulGoblin


BulGoblin nedir?

BulGoblin, Linux sistemler için geliştirdiğim terminal arayüzlü, açık kaynaklı, özgür, hafif ve hızlı bir dosya bulucusudur.

Bir Python betiği olan BulGoblin, sadece 4 KB boyutunda ve henüz beta aşamasında.

Her ne kadar kaynak kodu 90 satırcık olsa da, terminaldeki görünümüne ve hata ayıklamasına önem verdiğim için gerçekten çok emek verdim. Umarım çok fazla hatası veya çirkinliği yoktur.


BulGoblin’in Artıları:

1-) BulGoblin küçük ama işlevli bir yazılım. Halihazırda var olan komutları kullanıcının interaktif seçimleri doğrultusunda çalıştırdığı için de oldukça hafif.

2-) BulGoblin kullanıcıya birkaç arama yeri ve arama filtreleri sunar. Böylece kullanıcı aradığını daha hızlı bulabilir.

3-) BulGoblin, her ne kadar bir lisansa sahip olmasa da, açık kaynaklı ve özgür bir yazılımdır. Kaynak kodunu herkes değiştirebilir, geliştirebilir veya dağıtabilir.

4-) BulGoblin’in şah damarı olan tree ve python3 paketleri Pardus’ta zaten varsayılan olarak yüklü geldiği için ekstra bir şey kurmanıza gerek yok. BulGoblin’in kurulumunu ise gönderinin sonlarında anlatacağım.


BulGoblin’in Eksileri

1-) Ne kadar düzeltmeye çalıştıysam da bazı hataları var. Mesela büyük/küçük harf duyarlılık ayarı iyi çalışmıyor.

2-) Bazı işleri shell=True kullanarak yapması nedeniyle göz ardı edilemeyecek bir güvenlik riski var.

3-) Bir amatör olarak yazdığım bir betik olduğu için stabilitesi tartışılır.

4-) BulGoblin’in de KINPM’e benzer olarak bir GitHub sayfası yok, çünkü GitHub kullanmayı bilmiyorum.


BulGoblin nasıl indirilir ve kurulur?

Her şeye rağmen BulGoblin’in kurulumu çok kolay ve zahmetsizdir.

BulGoblin Orijinal İndirme Linki (Reklamsız/Güvenli)

Yukarıdaki linke tıklayın ve bulgoblin.py adlı dosyayı ev dizininizin içine indirin. Ardından Uçbirim Öykünücünüze şu komutu yapıştırın:

chmod +x ~/bulgoblin.py && sudo mv ~/bulgoblin.py /usr/local/bin/bulgoblin && echo "BulGoblin başarıyla kuruldu." || echo "Bir hata oluştu."


(Eğer kurulum başarısız olursa, bulgoblin.py adlı dosyanın adını değiştirmediğinizden ve dosyayı ev dizininize indirdiğinizden emin olup tekrar deneyin.)

Başarılı bir kurulumun ardından Uçbiriminize bulgoblin yazarak BulGoblin’i kullanabilirsiniz.

Keyifli kullanımlar dilerim! :slight_smile:

1 Beğeni

Merhaba Kodu inceledim ve Gerçekten Çok Güzel Bir Çalışma Olmuş Eline Sağlık.
Ve Geliştirme Konusundaki Çalışmlarınızı Destekliyorum Başarılarınızın Devamını Diliyorum.

Kodunuzda Nacizane Biraz Geliştirme Yaptım Size Referans Olması Açısından
Bahsettiğiniz
shell=True Güvenlik açığını düzelttim
büyük/küçük harf duyarlılık ayarını kapsamlı ve stabil hale getirdim.
Yenilik Olarak ise Bulduğu sonucu İstenirse Varsayılan Dosya Yöneticisi İle Konumu Açma İmkanı Getirdim.

#!/usr/bin/env python3

# BulGoblin (BETA) - 'xdg-open' Yol Temizleme Düzeltmesi
# HATA DÜZELTMESİ:
# 'tree' çıktısındaki '│ └──' gibi grafiksel karakterler,
# 'xdg-open' komutuna geçersiz bir yol gönderilmesine neden oluyordu.
# Kod, artık satırdaki ilk '/' karakterini bularak yolu temizliyor.
# cektor ...--- iyi çalışmalar.

try:
    from sys import exit
    from os import getpid, path
    from subprocess import run, DEVNULL, CalledProcessError, PIPE
    from time import sleep
    from getpass import getuser
    import re  
    
    user = getuser()
    pid = getpid()
    
    def h101lf():
        print(f"\n\nHata 101: {pid} numaralı işlem {user} tarafından durduruldu.\n")
        exit()
    def h102lf():
        print("\nHata 102: Girdiler hatalı!\n")
        exit()
    def h201mf():
        print("\nHata 201: BulGoblin güvenlik nedeniyle sudo (root) ile kullanılmamalıdır.\n")
        exit()
    
    if user == "root":
        h201mf()
    
    try:
        run(["clear"])
    except FileNotFoundError:
        pass
    
    try:
        sleep(1)
        print("\n--------------------------\n| <<< BulGoblin BETA >>> |\n--------------------------")
        sleep(1)
        print("\n------------------------------")
        optplc = input("\nArama Yeri Seçenekleri:\n\n1: Tüm Sistemde Ara\n2: Sadece Ev Dizininde Ara\n\n>>> ").replace(" ", "")
        sleep(1)
        print("\n------------------------------")
        optur = input("\nArama Türü Seçenekleri:\n\n1: Büyük/Küçük Harf Duyarsız Ara\n2: Büyük/Küçük Harf Duyarlı Ara\n3: Tam Kelime Ara (Duyarlı)\n\n>>> ").replace(" ", "")
        sleep(1)
        print("\n------------------------------")
        optnm = input("\nAranacak dosyanın veya dizinin adı:\n\n>>> ")
        if optnm == "":
            h102lf()
        
        sleep(1)
        print("\n------------------------------")
        
        search_path = ""
        grep_pattern = None

        if optplc == "1":
            search_path = "/"
            print(f"\nTüm sistemde ({search_path}) aranacak...")
        elif optplc == "2":
            search_path = f"/home/{user}"
            print(f"\nEv dizininde ({search_path}) aranacak...")
        else:
            h102lf()

        if optur == "1":
            grep_pattern = re.compile(re.escape(optnm), re.IGNORECASE)
            print(f"'{optnm}' için büyük/küçük harf duyarsız arama.")
        elif optur == "2":
            grep_pattern = re.compile(re.escape(optnm))
            print(f"'{optnm}' için büyük/küçük harf duyarlı arama.")
        elif optur == "3":
            grep_pattern = re.compile(r'\b' + re.escape(optnm) + r'\b')
            print(f"'{optnm}' için tam kelime ve büyük/küçük harf duyarlı arama.")
        else:
            h102lf()

        print("\nAğaç taranıyor... Bu işlem zaman alabilir, lütfen bekleyin.")
        
        try:
            # Sistem uyumluluğu için en temel 'tree -f' komutu
            tree_cmd = ['tree', '-f', search_path]
            
            tree_result = run(tree_cmd, 
                              stdout=PIPE,        
                              stderr=DEVNULL,     
                              text=True, 
                              encoding='utf-8', 
                              check=True)
            
            all_lines = tree_result.stdout.splitlines()
            found_files = []

            # --- HATA DÜZELTMESİ BURADA ---
            for line in all_lines:
                if grep_pattern.search(line):
                    # 'tree' çıktısındaki '│ └──' gibi grafiksel karakterleri temizle.
                    # Satırdaki ilk '/' karakterini bul ve oradan itibaren al.
                    path_start_index = line.find('/')
                    if path_start_index != -1:
                        clean_path = line[path_start_index:].strip()
                        found_files.append(clean_path)
            # --- DÜZELTME SONU ---
            
            if not found_files:
                print(f"\nSonuç bulunamadı: '{optnm}'")
                print()
                exit()
            
            print("\n--- Bulunan Sonuçlar ---")
            for i, file_path in enumerate(found_files):
                print(f" {i+1}: {file_path}") # Artık temiz yol yazdırılıyor
            print("--------------------------")

            while True:
                choice_str = input("\nBulunduğu dizini açmak için bir numara girin (Çıkmak için Enter): ")
                
                if choice_str == "":
                    print("\nÇıkılıyor.")
                    break
                
                try:
                    choice_int = int(choice_str)
                    if 1 <= choice_int <= len(found_files):
                        # 'selected_path' artık '/home/fatih/...' gibi temiz bir yol
                        selected_path = found_files[choice_int - 1]
                        
                        if path.isdir(selected_path):
                            dir_to_open = selected_path
                        else:
                            dir_to_open = path.dirname(selected_path)
                            
                        print(f"\nDosya yöneticisinde '{dir_to_open}' açılıyor...")
                        
                        try:
                            run(['xdg-open', dir_to_open], stderr=DEVNULL, stdout=DEVNULL, check=True)
                        except FileNotFoundError:
                            print("\nHata: 'xdg-open' komutu sisteminizde bulunamadı. Dizin açılamıyor.")
                        except CalledProcessError:
                            # Bu hatayı artık almamalısınız
                            print("\nHata: Dizin 'xdg-open' ile açılırken bir sorun oluştu.")
                        
                        break 
                    else:
                        print(f"Geçersiz numara. Lütfen 1 ile {len(found_files)} arasında bir sayı girin.")
                
                except ValueError:
                    print("Hatalı giriş. Lütfen bir sayı girin.")
        
        except FileNotFoundError:
            print("\nHATA: 'tree' komutu bulunamadı.")
            print("Lütfen 'tree' paketini kurun (Örn: sudo apt install tree)\n")
            exit()
        except CalledProcessError as e:
            print(f"\nHATA: 'tree' komutu çalıştırılırken bir hata oluştu (Hata Kodu: {e.returncode}).")
            print("Arama yolu veya 'tree' komutu ile ilgili bir sorun olabilir.\n")
            exit()
        except Exception as e:
            print(f"\nArama sırasında beklenmedik bir hata oluştu: {e}\n")
            exit()

        print()
        exit()
        
    except (KeyboardInterrupt, EOFError):
        h101lf()
except Exception as sbp:
    print(f"\nHata 901: Bilinmeyen Hata ({sbp})\n")
    exit()

Saygılar,

1 Beğeni

elinize sağlık hocam süper olmuş

@kivanc , tebrik ederim.


Bir önerim olacak:

Hemen şimdi kod geliştirmeyi bırakıyorsun ve Github’a nasıl üye olunur, nasıl proje oluşturulup içine proje dosyaları atılır, nasıl readme eklenir bunları araştırıp öğreniyorsun. Daha sonra da aklına ne proje gelirse orada başlık açıp açıp içine atıyorsun. :wink:


Başarılar.

1 Beğeni

teşekkürler eksik olmayın, en kısa zamanda öğreneceğim :heart: