Nowe posty

Autor Wątek: Mały skrypt szukający - problem  (Przeczytany 3641 razy)

Skwareknec

  • Gość
Mały skrypt szukający - problem
« dnia: 2011-11-01, 16:23:16 »
Witam serdecznie wszystkich Forumowiczów:) Od niedawna bawię się w linuksie i postanowiłem napisać kilka mały skryptów. Niestety napotkałem pewien problem. Chciałbym, aby mój skrypt wyszukiwał pewien plik, którego nazwę poda użytkownik lub poda część tej nazwy. Jak widać poniżej najpierw pobieram od użytkownika nazwę, zapisuję ją do zmiennej, a następnie do drugiej zmiennej przypisuję ciąg znaków. Na koniec wykonuję finda, który nie działa. Bardzo proszę o wytłumaczenie co robię nie tak. Mój kod:
#!/bin/bash

echo "Podaj nazwe: "
read ZMIENNA
NAME=" -name '*$ZMIENNA*'"

find $NAME

Offline Robert

  • Administrator
  • Guru
  • *****
  • Wiadomości: 2516
    • Zobacz profil
Mały skrypt szukający - problem
« Odpowiedź #1 dnia: 2011-11-01, 17:01:23 »
A nie prościej by było zrobić to z jedną zmienną?

Przerobiłem trochę twój skrypcik na taki z jedną zmienną i zadziałało.
Na dole jest pomoc - zanim zajrzysz spróbuj znaleźć swój sposób.

#!/bin/bash

echo "Podaj nazwę: "
read ZMIENNA
# NAME=" -name '*$ZMIENNA*'"

find -name $ZMIENNA
Zanim popełnisz grafomaństwo: 1 | 2 | 3
Baza RPM Jak szukać informacji

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Mały skrypt szukający - problem
« Odpowiedź #2 dnia: 2011-11-01, 17:31:07 »
NAME jest ciągiem znaków i nie jest parsowany przez basha (dlatego jest rozpoznawany jako jeden parametr, a nie dwa). Jeżeli potrzebujesz tworzyć parametry funkcji w locie to użyj funkcji eval, która wykona ciąg znaków.

#!/bin/bash

echo "Podaj nazwe: "
read ZMIENNA
NAME=" -name '*$ZMIENNA*'"

eval "find $NAME"
Ale w tym konkretnym przypadku rozwiązanie roca jest lepsze.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3069
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Mały skrypt szukający - problem
« Odpowiedź #3 dnia: 2011-11-01, 22:04:04 »
Śmiem tylko zauważyć, że szukanie "kuku" i "*kuku*" daje nieco odmienne rezultaty.

Natomiast
#!/bin/bash

echo "Podaj nazwe: "
read ZMIENNA
find -name "*${ZMIENNA}*"
powinno działać jak autor pytania oczekuje.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

  • Gość
Mały skrypt szukający - problem
« Odpowiedź #4 dnia: 2011-11-03, 19:16:40 »
Witam, kiedyś z nudów popełniłem coś w tym stylu wykorzystując Python'a:
#!/usr/bin/python

import os

if __name__ == '__main__':
        print
        dir = raw_input('>>> Katalog : ')
        name = raw_input('>>> Plik : ')
        print
def dir_list_folder(dir, name):
     dirList = []
     for fn in os.listdir(dir):
         dirfile = os.path.join(dir, fn)
         if os.path.isdir(dirfile):
              dir_list_folder(dirfile, name)
         if os.path.isfile(dirfile):
              if fn == name:
                   print "[+] Lokalizacja : %s " % dirfile
                   fsize = os.path.getsize(dirfile)
                   print "[+] Rozmiar : %0.1f kb" % float(fsize/1024.0)
                   print

     return dirList

if __name__ == '__main__':
     for item in dir_list_folder(dir, name):
              print item
Skrypt pyta użytkownika o nazwę pliku oraz lokalizację. Przykład
$ ./fsearcher 

>>> Katalog : /home/     # wskazujemy miejsce, w którym chcemy szukać danego pliku [Enter];
>>> Plik : example.txt   # podajemy nazwę pliku [Enter];

[+] Lokalizacja : /home/płomyk/example.txt
[+] Rozmiar : 0.9 kb
Oczywiście można rozwinąć wachlarz ewentualnych dodatkowych funkcji (np. dodać informacje o nieznalezionym pliku, odróżnianie plików od folderów itd). Ja potrzebowałem jedynie tych dwóch: lokalizacja oraz rozmiar pliku. Zauważ, że skrypt "nie toleruje" podania nazwy pliku np. jako example.*!. Niestety nie pomyślałem nawet o tym pisząc ten kod, tak więc jego działanie jest bardzo podstawowe i okrojone.
Jeżeli zdecydujesz się z niego skorzystać, po prostu utwórz plik tekstowy, wklej kod, zapisz, nadaj mu prawo wykonywania wykorzystując polecenie chmod +x fsearcher (oczywiście nazwa jest dowolna!) i uruchom tak jak jest to podane w przykładzie - ./fsearcher.
Mała uwaga. Myślę, że lepszym rozwiązaniem będzie uruchamianie tego skryptu jako root, ze względu na errory, dotyczące braku uprawnień "zwykłego" użytkownika do niektórych katalogów itd. Ewentualnie można wykorzystać sudo.