다음과 같은 문제가 있습니다. 동일한 폴더에 있는 확장명이 .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"가 추가됩니다.