Я использую FreeBSD и понимаю и использую опцию -prune
on, find
чтобы предотвратить спуск команды в подкаталог. Но я нахожу необходимый синтаксис очень неуклюжим и неловким. Он также не предотвращает появление самого очищенного каталога, что поправимо, но раздражает.
Я хотел бы создать короткий скрипт/псевдоним, который будет добавлять новый -noenter
аргумент к find
команде.еслион дается перед любыми другими праймериз (для простоты).
Цель состоит в том, чтобы я мог набрать одно из следующего:
find -xs /dir -noenter '$*' -name '*.conf' -ls
find -x -s /dir -noenter '$*' -name '*.conf' -ls
и он преобразует аргументы и выполнит:
/usr/bin/find -xs /dir \( -name '$*' -prune -or \( -name '*.conf' -and ! \( -type d -and -name '$*' \) \) \) -ls
/usr/bin/find -x -s /dir \( SNIPPED \) -ls
но я также могу ввести как обычно любую обычную команду «find», и она будет прозрачно передана для /usr//bin/find
выполнения.
Логически скрипт должен определить первый аргумент после имени каталога, а затем проверить, является ли он:
- ... равно
-noenter
и за которым следуют как минимум еще 2 аргумента (в этом случае я знаю, как построить аргумент, который мне нужно передать,/usr/bin/find
зная, какие аргументы были до/после него);или - ... равно,
-noenter
но не сопровождается как минимум еще 2 аргументами (= ошибка);или - ...что-либо еще или dir было последним аргументом или не было найдено (= передать все исходные аргументы
/usr/bin/find
без изменений).
Я могу сделать все это, кроме одного — как мне закодировать часть скрипта, которая проверяет argv, чтобы определить, какой номер arg (если таковой имеется) является аргументом dir
?
Я выбрал оболочку sh
для написания скриптов.
решение1
Если вы хотите проверить наличие и местоположение определенного аргумента, все, что вам нужно сделать, это проанализировать командную строку и проверить каждый аргумент на соответствие вашему «ожидаемому» значению. Итак, вам нужно проверить каждый аргумент на значение, -noenter
а затем вывести строку, указывающую положение и имя переменной -noenter
:
for i in `seq 1 $#`; do
ref=`eval "echo \\$$i"`
if [ $ref == '-noenter' ]; then echo "arg $i is $ref"; break; fi
done
Теперь то же самое, только позиция аргумента -noenter
сохраняется в $mitsos
, а позиция аргумента перед ним — в $mary
:
for i in `seq 1 $#`; do
ref=`eval "echo \\${$i}"`
if [ $ref == '-noenter' ]; then
mitsos=$i
eva=$(($i-1))
mary=`eval "echo \\${$eva}"`
break
fi
done
и теперь $mitsos
имеет позицию -noenter
или не имеет значения и $mary
значение аргумента, предшествующего -noenter
. В этот момент, если $mary
имеет значение, которое /dir
вызнатьследующий аргумент — -noenter
и вы можете продолжить реализацию find
, в противном случае вы используете версию системы или выводите сообщение об ошибке. Наконец, если вас не волнует положение , -noenter
вы можете опустить строку mitsos=$i
.