경로의 올바른 결말을 해결하는 방법은 무엇입니까?

경로의 올바른 결말을 해결하는 방법은 무엇입니까?

이 경로를 보유하는 쉘 변수가 있습니다

/usr/share/man/man1/bitmap.1

bitmap.1이라는 파일이 있을 수 있지만 bitmap.1.z, bitmap.1.gz, bitmap.1.Z일 수도 있습니다.

이제 실제 파일을 함수에 전달하는 동시에 올바른 파일을 확인하고 싶습니다.

function process {
    # do something
}

path="/usr/share/man/man1/bitmap.1"

process ${path}.(z|Z|gz) # here the shell shall resolve the real filename

우아하게 할 수 있는 방법이 있나요? 아니면 bitmap.1, bitmap.1.z 등이 종료되었는지 테스트한 다음 해당 파일을 함수에 전달해야 합니까???


나는 Bourne-Shell로 제한되어 있으므로 Brace Expansion을 사용할 수 없다는 점을 잊어버리십시오.

답변1

Bourne Shell에서 여전히 글로빙을 수행할 수 있습니다.

for f in ${given-path}*; do
process $f
done

Bourne 쉘 구문으로 제한하여 쉘 스크립팅을 최대한 많이 수행하는 것이 좋습니다. 휴대성을 극대화한 제품입니다. 많은 경우 속도도 향상됩니다.

답변2

가능한 확장 목록을 알고 있다면 다음을 수행할 수 있습니다.

process ${path}{,.Z,.Z,.gz}

답변3

나는 크리스천이 올바른 길을 가고 있다고 믿습니다. 경로의 적어도 일부를 확신하는 경우 Bash의 내장 글로빙을 사용하면 패턴과 일치하는 모든 파일이 생성됩니다.

예를 들어, .profile에는 gzip으로 압축된 로그 파일과 일반 텍스트 로그 파일을 분류하는 데 자주 사용하는 기능이 있습니다.

function mscat {
  is_gzip="\.gz$"

  for file in $@; do
    if [[ "$file" =~ $is_gzip ]]; then
      zcat $file
    else
      cat $file
    fi
  done
}

나는 다음과 같이 부를 것입니다 :

mscat /var/log/ncftpd/sess.2010*

Globbing은 둘 이상의 결과를 생성할 수 있으므로 'process' 함수는 여러 인수에 따라 작동할 수 있어야 합니다. 내 예에서는 $@의 각 인수를 반복하여 이 작업을 수행하는 방법을 볼 수 있습니다.

답변4

파일이 하나만 있으면 bash globbing을 사용할 수 있습니다process ${path}*

관련 정보