grpsch [İstenilen mime-type'a göre metin bazında arama]

Başlatan sem, 01 Eylül 2011 - 16:44:15

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

sem

NOT: İlk iletiler nedeni ile isim değişikliğine gidildi =)

Programın bir iddiası yoktur... Yeni yeni Python çalışmaya başladım... O nedenle hello world yapana kadar, biraz da olsa işe yarar bir şeyler olsun diye böyle bir şey yapayım dedim... Geliştirip UGT adına sunacaktım fakat şimdilik geliştirme fırsatım yok maalesef...

Arama yapılacak dizini belirtiyoruz, dizinden sonra arayacağımız anahtar kelimeyi giriyoruz (büyük küçük harf duyarlı olarak) ve en son olarak mime-type bilgisini dolduruyoruz. Program belirtilen dizin ve alt dizinler içerisindeki dosyalarda, belirtilen mime-type'a sahip dosyalar içerisinde, belirtilen anahtarı metin bazında arar... Örnek kullanım:

Alıntı YapArama yapılacan dizini girin ( 0 - Çıkış): /home/semetey/Desktop
Dosyalarında aramak istediğiniz anahtarı girin ( 0 - Çıkış): #include 
Arama yapılacak dosya türünün mime-type özelliğini girin (0 Çıkış): text

"mime-type bilgisi içerisnde "text" ibaresini barındıran tüm dosyalarda "#include" ibaresi geçiyor mu diye bak." demiş oluyoruz programa... O da işleme koyduğu dosya ve dizinleri ekranda yazdıktan sonra*** en son olarak şöyle bir çıktı veriyor:

Satır No    Kaynak Dosya
------------------------
  0001      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/mylist.c
  0002      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/mylist.c
  0003      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/mylist.c
  0005      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/mylist.c
  0004      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/mylist.h
  0001      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/main.c
  0002      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/main.c
  0003      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/main.c
  0004      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/main.c
  0005      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/main.c
  0006      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/main.c
  0008      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek2/main.c
  0001      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek1/main.c
  0002      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek1/main.c
  0003      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek1/main.c
  0004      /home/semetey/Desktop/C_ile_dizin_iceriginin_elde_etme/C_programlama_EK/ornek1/main.c
  0001      /home/semetey/Desktop/untitled folder/ornek2/mylist.c
  0002      /home/semetey/Desktop/untitled folder/ornek2/mylist.c
  0003      /home/semetey/Desktop/untitled folder/ornek2/mylist.c
  0005      /home/semetey/Desktop/untitled folder/ornek2/mylist.c
  0004      /home/semetey/Desktop/untitled folder/ornek2/mylist.h
  0001      /home/semetey/Desktop/untitled folder/ornek2/main.c
  0002      /home/semetey/Desktop/untitled folder/ornek2/main.c
  0003      /home/semetey/Desktop/untitled folder/ornek2/main.c
  0004      /home/semetey/Desktop/untitled folder/ornek2/main.c
  0005      /home/semetey/Desktop/untitled folder/ornek2/main.c
  0006      /home/semetey/Desktop/untitled folder/ornek2/main.c
  0008      /home/semetey/Desktop/untitled folder/ornek2/main.c
  0001      /home/semetey/Desktop/untitled folder/ornek1/main.c
  0002      /home/semetey/Desktop/untitled folder/ornek1/main.c
  0003      /home/semetey/Desktop/untitled folder/ornek1/main.c
  0004      /home/semetey/Desktop/untitled folder/ornek1/main.c
  0009      /home/semetey/Desktop/ornek2/mylist.c
  0010      /home/semetey/Desktop/ornek2/mylist.c
  0011      /home/semetey/Desktop/ornek2/mylist.c
  0013      /home/semetey/Desktop/ornek2/mylist.c
  0008      /home/semetey/Desktop/ornek2/mylist.h
  0008      /home/semetey/Desktop/ornek2/main.c
  0009      /home/semetey/Desktop/ornek2/main.c
  0010      /home/semetey/Desktop/ornek2/main.c
  0011      /home/semetey/Desktop/ornek2/main.c
  0012      /home/semetey/Desktop/ornek2/main.c
  0013      /home/semetey/Desktop/ornek2/main.c
  0015      /home/semetey/Desktop/ornek2/main.c


Çıktı gayet açık.  Örneğin çıktının son satırından;

0015      /home/semetey/Desktop/ornek2/main.c   ->>>> Belirtilen dosyanın mime-type bilgisi içerisinde text ibaresi geçiyor ve 15. satır #include ibaresini içeren bir satır...


*** Burada uzun işlemlerde programın takılı kalıp kalmadığını anlamak için, rahatlık versin diye pygrpsrc_file.py dosyası içerisinde 83. satır 5. sütundan başlayan;
print "İşlemdeki Dosya: %s" %searchPath

şeklinde bir satır ekledim... Bu doğal olarak hız kaybına yol açıyor. Eğer programı kullanır ve bu işlemi fazlaca dosya içeren dizinler için yapacaksanız bu satırın başına # koymanız ya da silmeniz hız açısından yararınıza olur...

Kodlar aşağıdadır...

Önemli NOT:
Programı ilk gösterime sunduktan sonra, daha önceden hep C tabanlı diller çalışmış birisinin ağzını açıkta bırakacak açıklamalarından dolayı @utdmr'e de teşeküleri borç bilirim =)=)


main.py
#/usr/bin/env python
# -*- coding: utf-8 -*-


import os
import pygrpsrc_file as fs_modul    #file search modul


############################
#~~~~~~~~Variables~~~~~~~~~#
############################

#to get parent dir
searchPath = ""

#to search
searchKey = ""

#for mime types of file
searchMTypes = ""




#####getting path from user
while True:
    searchPath = raw_input("Arama yapılacan dizini girin ( 0 - Çıkış): ")
   
    try:
        if not searchPath:
            print "Bir dizin girilmedi..."
            continue
        elif int(searchPath) == 0:
            quit()
    except ValueError: #imput is not empty string and not 0
        break
   
   
#check file and/or permission
if not os.path.exists(searchPath):
    print "Dosya bulunamadı veya dosyayı okuma yetkiniz yok"
    quit()


#####getting key from user
while True:
    searchKey = raw_input("Dosyalarında aramak istediğiniz anahtarı girin ( 0 - Çıkış): ")
   
    try:
        if not searchKey:
            print "Bir anahtar girilmedi..."
            continue
        elif int(searchKey) == 0:
            quit()
        else:
            pass
    except ValueError:
        break   


#####getting mime types from user
while True:
    if not os.path.isdir(searchPath):
        searchMTypes = "ALREADY THIS IS A FILE" # user have'nt to know mime-type of a file
        break
   
    searchMTypes = raw_input("Arama yapılacak dosya türünün mime-type özelliğini girin (0 Çıkış): ")
   
    try:
        if not searchMTypes:
            print "mime-type girilmedi..."
            continue
        elif int(searchMTypes) == 0:
            quit()
        else:
            pass
    except ValueError:
        break

   
fs_modul.call_select_all_files_in_dir(searchPath, searchKey, searchMTypes)
   
 


pygrpsrc_file.py
#/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import errno
import commands


############################
#~~~~~~~~Variables~~~~~~~~~#
############################

#globals
searchKey_FMODUL = ""
searchMTypes_FMODUL = ""
saved_file_count = 0



############################
#~~~~~~~~Functions~~~~~~~~~#
############################

##################################################################################################

def call_select_all_files_in_dir(searchPath_PAR, searchKey_PAR, searchMTypes_PAR):
    global searchKey_FMODUL
    global searchMTypes_FMODUL
    global sourceFile
   
    searchKey_FMODUL  = searchKey_PAR
    searchMTypes_FMODUL = searchMTypes_PAR
   
    #open file
    try:       
        sourceFile = open("./.__ugt-pygrpsrc_file_to_save_files_by_functions__", "w")
    except IOError, e:       
        print "Hata... Dosya açılamadı"
        if e.errno == errno.ENFILE:
            print "Maksimum dosya sayısı"
        if e.errno == errno.EROFS:
            print "Salt okunur dizi"
        if e.errno == errno.ENAMETOOLONG:
            print "Dosya ismi sistem için çok uzun"
           
        quit()       
           
   
    #call function to select files
    select_all_files_in_dir(searchPath_PAR)
   
   
    #close file and reopen with read mode
    sourceFile.close()

    #open file
    try:       
        sourceFile = open("./.__ugt-pygrpsrc_file_to_save_files_by_functions__", "r")
    except IOError, e:       
        print "Hata... Dosya açılamadı"
        if e.errno == errno.ENFILE:
            print "Maksimum dosya sayısı"
        if e.errno == errno.EROFS:
            print "Salt okunur dizi"
        if e.errno == errno.ENAMETOOLONG:
            print "Dosya ismi sistem için çok uzun"
           
        quit()
   
    #set file pointer to top and call function to find key from saved filed
    sourceFile.seek(0)
    find_key_in_files()   
   
    #close file
    sourceFile.close()
    #remove file
    os.remove("./.__ugt-pygrpsrc_file_to_save_files_by_functions__")


##################################################################################################

def select_all_files_in_dir(searchPath):   
    print "İşlemdeki Dosya: %s" %searchPath
     
    if searchMTypes_FMODUL == "ALREADY THIS IS A FILE":  ###user enter just a file
        sourceFile.writelines(searchPath + "\n")
        return

    if os.path.isdir(searchPath):
        dirContent = os.listdir(searchPath)
               
        for i in dirContent:
            select_all_files_in_dir(searchPath + os.sep +i)
    else:
        searchPath = searchPath.replace('"', """\"""")
        searchPath = searchPath.replace("'", """\'""")               
        command = """ file "%s"  """ %searchPath      # shell command for mime-type ("file /dir/subdir/file")
       
        fileMType = ""
        try:         
            fileMType = commands.getstatusoutput(command)[1].split(searchPath + ": ")[1]
        except IndexError:
            pass
       
         
        if searchMTypes_FMODUL in fileMType:
            sourceFile.writelines(searchPath + "\n")   

       
##################################################################################################

def find_key_in_files():
       
    os.system("clear; clear")
    print "Satır No    Kaynak Dosya"
    print "------------------------"
   
    for sourceFileLine in sourceFile:
        sourceFileLine = sourceFileLine.replace("\n", "")
       
        try:
            tmp_file = open(sourceFileLine, "r")
        except IOError:
            continue
       
        line_no = 1
        for tmpFileContent in tmp_file:
            if searchKey_FMODUL in tmpFileContent:
                print "  %.4d      %s" %(line_no, sourceFileLine)
            line_no += 1
           
        tmp_file.close()

       
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

egcodes

Yanlış anlamadıysam eğer şu komut işi görüyor zaten.


grep -l "include" *.txt

yada

grep -l "include" folder/*.txt


Ama yok öğrenmek için yapıyorsan olur tabi :)
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

sem

Aynen dediğin gibi @egcodes... Hello World yerine daha yararlı bir şey olsun dedim... Yarar derken hem kod açısından; örneğin özyinemeli fonksiyon örneği görmek isteyen arkadaşlar kodları inceleyebilir gibi, hem de gerçekten iş yapan bir şey olsun istedim... Yani hello world yerine böyle bir şey yapayım dedim =)

Sunucu içerisinde geçenlerde yöneticilerden arkadaşlar grep aramaları yapıyordu.. Öyle öyle kombine şeklinde aklıma gelen şeyler sonuucu hello world yerine böyle bir şey yapayım dedim...

Ve tabii ki öğrenmek için yapıldı... Ve dediğin gibi aynı işi grep ile yapmak mümkün... Zaten program isimlendirirken Python uygulamalarının hep py ile başladığını gördüm, grep ile aynı işi yapıyor program ve bir arama programı... Hali ile

PYthon GReP SeaRCh şeklinde -> pygrpsrc koydum adını =)

Yoksa başka bir amaca hizmeti yok =)


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 01 Eylül 2011 - 16:58:37

EK: grep aramasında satır nımarası göremedim bu arada... Belki bir opsiyonu vardır fakat ben bulamadım.. Uygulamaya satır numarasını o nedenle eklemiştim =)=)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

egcodes

He anladım :D

Yalnız python yazılan programda py olacak diye bişey yok o genelde kütüphane isimlerine ön ek olarak koyuyorlar bence benim şahsi görüşüm:D kaldır onu :D

Bi de search için src source gibi ollmuş belki sch ya da srch olabilir
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

sem

Aynen kaldırılabilir... Bu arada şunu da ekleyeyim; mime bilgisini Mixer programındaki ile aynı mantıkla alıyor... Yani uzantısı olmayan dosyalarda da mime-type belirlemek mümkün =)

Seni mi kıracağım, kaldırayım hemencik =)

EK: text, ASCII vs gibi mime'typelar...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?