Strona 1 z 1
[+] Jak uniknąć wpisywania w cudzysłowie wyrażenia regularnego dla polecenia find
: 19 stycznia 2011, 20:56
autor: piter
Witam!
Stworzyłem sobie alias do polecenia find:
Czy jest jakaś możliwość aby uniknąć umieszczania nazwy szukanego pliku (wyrażenia regularnego) w cudzysłowie tzn. zamiast:
zapisać tak:
: 29 stycznia 2011, 07:19
autor: fnmirk
Odświeżenie tematu.
: 29 stycznia 2011, 11:00
autor: lessmian2
Najprościej tak:
Wtedy bash nie interpretuje znaku '*' tylko przekazuje go do finda.
: 30 stycznia 2011, 21:26
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:
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ć:
ale nie wiem jak to rozwiązać.
: 31 stycznia 2011, 20:26
autor: lessmian2
Trzy dyszki poproszę
: 31 stycznia 2011, 22:10
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.
: 02 lutego 2011, 18:15
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.
: 02 lutego 2011, 21:03
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:
Ale to też nie działa, bo zmiany (set -f / set +f) nie są przekazywane między skryptem a wierszem poleceń.
: 02 lutego 2011, 21:31
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

: 02 lutego 2011, 22:11
autor: piter
Super. Faktycznie działa. Wielkie dzięki za pomoc.