3

Я использую FreeBSD, и я понимаю и использую опцию -prune в 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 для выполнения.

По логике сценарий должен идентифицировать первый аргумент после имени dir, а затем проверить:

  • ... равно -noenter и сопровождается как минимум еще двумя аргументами (в этом случае я знаю, как построить аргумент, который мне нужно передать в /usr/bin/find , зная, какие аргументы были до / после него); или же
  • ... равно -noenter но не сопровождается как минимум еще 2 аргументами (= ошибка); или же
  • ... что-либо еще или dir было последним аргументом или не было найдено (= передать все исходные аргументы в /usr/bin/find без изменений).

Я могу сделать все это, кроме одной вещи - как мне кодировать ту часть скрипта, которая проверяет argv, чтобы определить, какой номер arg (если есть) является аргументом dir ?

Мой выбор оболочки - это sh для сценариев.

1 ответ1

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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .