수정된 "찾기" 기능에 대한 스크립트의 인수 처리?

수정된 "찾기" 기능에 대한 스크립트의 인수 처리?

저는 FreeBSD를 사용하고 있으며 명령이 하위 디렉토리로 내려가는 것을 방지하기 위해 -pruneon 옵션 을 이해하고 사용합니다. 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.

관련 정보