7za는 아카이브 이름을 읽습니다.

7za는 아카이브 이름을 읽습니다.

다음과 같은 문제가 있습니다. 동일한 폴더에 있는 확장명이 .jpg인 단일 파일의 이름을 읽고 이를 아카이브 이름으로 사용하는 bash 스크립트를 작성하고 싶습니다.

/Sample.jpg
/Sample.7z <--

ls *jpg > OutputFileName
...
7za a Sample.7z ...

이 목표를 어떻게 달성할 수 있나요?

답변1

간단한 쉘 인수 확장을 사용하여 이 문제를 해결할 수 있습니다. bash 기능은 필요하지 않습니다.

#!/bin/sh

set -- *.jpg
if [ $# -ne 1 ] || [ "$1" = "*.jpg" ]
then
  echo "Error: there is not exactly one .jpg file here"
  exit 1
fi

7za a "${1%.jpg}".7z "$1" # ...

스크립트는 위치 매개변수를 확장된 와일드카드 문자로 설정합니다 *.jpg. 해당 결과 파일명이 없으면 오류가 발생하고 종료됩니다. 테스트의 후반부는 와일드카드 불일치 사례에 대한 것입니다(일반 sh 사용).어느파일이므로 여전히 리터럴 " " 문자열로 확장되지 않습니다 *.jpg. Bash를 사용하는 경우 두 번째 검사를 제거하고 명령 shopt -s nullglob앞에 set와일드카드를 만들 수도 있습니다.삭제됨확장하는 동안 아무것도 일치하지 않는 경우.

일치하는 파일이 있으면 호출 7za하고 매개변수 확장을 통해 아카이브 이름을 제공합니다. 그러면 후행 ".jpg"가 제거되고 ".7z"가 추가됩니다.

관련 정보