[+] Jak unikn

Potrzebujesz pomocy z C, C++, perl, python, itp.
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

[+] Jak uniknąć wpisywania w cudzysłowie wyrażenia regularnego dla polecenia find

Post autor: piter »

Witam!

Stworzyłem sobie alias do polecenia find:

Kod: Zaznacz cały

mf='find ~ -name'
Czy jest jakaś możliwość aby uniknąć umieszczania nazwy szukanego pliku (wyrażenia regularnego) w cudzysłowie tzn. zamiast:

Kod: Zaznacz cały

mf "*.txt"
zapisać tak:

Kod: Zaznacz cały

mf *.txt
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Post autor: fnmirk »

Odświeżenie tematu.
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Najprościej tak:

Kod: Zaznacz cały

mf \*.txt
Wtedy bash nie interpretuje znaku '*' tylko przekazuje go do finda.
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Jest to ciekawy sposób, ale nie do końca rozwiązuje problem. Co prawda skraca polecenie o jeden znak, ale nadal trzeba pamiętać o odpowiednim zapisie np. takim:

Kod: Zaznacz cały

mf log.\*
Natomiast ja chciałbym całkowicie uwolnić się od stosowana cudzysłowu czy ukośnika.
Myślałem o czymś takim:

Kod: Zaznacz cały

alias mf='cd ~/.pusty_katalog ; find ~ -name'
Teraz bash nie rozwinie znaku '*', ale rozwiązanie to ma swoje wady. Po pierwsze trzeba mieć stworzony wcześniej katalog "~/.pusty_katalog" (ewentualnie dopisać sobie jego stworzenie do aliasu), a po drugie, co ważniejsze, po wykonaniu polecania znajdziemy się w nowym katalogu. Przydałoby się dodać:

Kod: Zaznacz cały

cd -
ale nie wiem jak to rozwiązać.
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Trzy dyszki poproszę ;)

Kod: Zaznacz cały

alias mf="set -f; find ~ -name $*; set +f"
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Nie mogę dojść co miałeś na myśli pisząc $*. Miałeś na myśli $1? Jeśli tak to spróbuj wykonać ten alias kilka razy z różnymi argumentami np. *.txt, a następnie *.jpg. Może ja coś źle robię, ale chyba nie do końca to dobrze działa.
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Faktycznie, miało być $1. Jakaś wersja testowa się wkradła ;) Co do niedziałania, to też faktycznie. Testowałem na jednym przykładzie i pewnie przez to uznałem, że działa.
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Kod: Zaznacz cały

$ grep "alias mf" .bashrc 
alias mf='set -f; find ~ -name $1; set +f'
$ mf *.jpg
find: brak argumentu dla `-name'
$ mf *.txt
/home/piter/screenshot-2010-02-13-193418.jpg
Czyli z tego by wynikało, że najpierw jest rozwijany alias, następnie "wciskany enter", a dopiero po tym wczytywany argument $1.
Kombinowałem jeszcze w ten sposób:

Kod: Zaznacz cały

alias mf='set -f; ~/myfind'

Kod: Zaznacz cały

$ cat ./myfind 
find ~ -name $1
set +f
Ale to też nie działa, bo zmiany (set -f / set +f) nie są przekazywane między skryptem a wierszem poleceń.
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Dokładnie. Globowanie wyrażenia *.txt następuje wcześniej niż wykonanie aliasu. Ale znalazłem rozwiązanie (dokładny opis tu) :)

Kod: Zaznacz cały

#definicja funkcji pomocniczej
noglob_helper() {
    "$@"
    case "$shopts" in
        *noglob*) ;;
        *) set +f ;;
    esac
    unset shopts
}

#takiż alias
alias noglob='shopts="$SHELLOPTS"; set -f; noglob_helper'

#nasz alias "bez globowania"
alias find='shopts="$SHELLOPTS"; set -f; noglob_helper find ~ -name'
Hak niemożebny, ale działa ;)
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Super. Faktycznie działa. Wielkie dzięki za pomoc.
ODPOWIEDZ