Korzystam z FreeBSD i rozumiem i używam tej -prune
opcji, find
aby zapobiec zejściu polecenia do podkatalogu. Ale uważam, że niezbędna składnia jest bardzo niezdarna i niezręczna. Nie zapobiega również wyświetlaniu samego przyciętego katalogu, który można naprawić, ale irytuje.
Chciałbym utworzyć krótki skrypt / alias, który -noenter
spowoduje dodanie nowego argumentu do find
polecenia, jeśli zostanie podany przed innymi podstawowymi (dla uproszczenia).
Chodzi o to, że mogę wpisać dowolny z:
find -xs /dir -noenter '$*' -name '*.conf' -ls
find -x -s /dir -noenter '$*' -name '*.conf' -ls
i skonwertuje argumenty i wykona:
/usr/bin/find -xs /dir \( -name '$*' -prune -or \( -name '*.conf' -and ! \( -type d -and -name '$*' \) \) \) -ls
/usr/bin/find -x -s /dir \( SNIPPED \) -ls
ale mogę również normalnie wpisać dowolną rutynową komendę „znajdź” i przekaże ją w sposób przezroczysty /usr//bin/find
do wykonania.
Logicznie skrypt musi zidentyfikować pierwszy argument po nazwie katalogu, a następnie sprawdzić, czy jest to:
- ... równa się
-noenter
i następuje co najmniej 2 kolejne argumenty (w takim przypadku wiem, jak zbudować argument, do którego muszę przejść/usr/bin/find
, wiedząc, które argumenty były przed nim / po nim); lub - ... równa,
-noenter
ale nie następuje po niej jeszcze 2 argumentów (= błąd); lub - ... cokolwiek innego lub katalog był ostatnim argumentem lub nie został znaleziony (= przekaż całe oryginalne argumenty do
/usr/bin/find
niezmienionego).
Mogę to wszystko zrobić z wyjątkiem jednej rzeczy - w jaki sposób kodować część skryptu, która bada argument argv, aby stwierdzić, który numer argumentu (jeśli istnieje) jest dir
argumentem?
Mój wybór powłoki dotyczy sh
skryptów.
źródło
find -x -noenter .....
powinien to być błąd). Sądzę, że musi sprawdzić arg po „dir”. Prawdopodobnie potrafię to rozgryźć na podstawie tego, co napisałeś, więc jest bardzo blisko. Czy chcesz edytować odpowiedź, aby ją zaakceptować, czy?-noenter
lub bez zmiennej. Możesz więc sprawdzić wartość zmiennej$eva
, gdzieeva=$(($mitsos-1))
i jeśli argument na pozycji$eva
nie jest równydir
, kontynuuj implementację, w przeciwnym razie korzystasz z systemu. Przeredaguję odpowiedź, aby to odzwierciedlić.eval 'echo "${'$i'}" '
zależności od twojego, rozwiązują one problemy: (dane wyjściowe) lubeval 'value="${'$i'}" '
(przypisanie). Zauważ, że zakończenie + ponowne uruchomienie znaków cudzysłowu zawiera „$ i” jako wartość zamiast odwrotnego ukośnika + $ powtarzane. Nadal nie obsługuje wyglądów powłoki w wierszu poleceń, np.\(
Lub|
nie jestem pewien, co można z tym zrobić. Kredyt należy do Ciebie, ale jeśli możesz łatwo zaktualizować, aby naprawić, lub przynajmniej zaktualizować, aby zanotować wyjątki, aby inni mogli uzyskać lepszy wynik, jeśli skorzystają z tej odpowiedzi?