저는 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
.