저는 bash 스크립팅을 처음 접했고 다음과 같이 unpack이라는 스크립트를 작성하고 싶습니다.
unpack [-r] [-v] file [file...]
-v - verbose
-r - recursive - will traverse contents of folders recursively, performing unpack on each.
어떤 압축이 사용되는지 확인하고 이러한 압축 유형에 대한 압축 풀기를 수행해야 합니다.
파일 이름과 확장자는 아무 의미도 없다고 가정합니다. 사용할 방법을 알 수 있는 유일한 방법은 file 명령을 사용하는 것입니다. 4가지 압축 풀기 옵션이 있습니다. gunzip, bunzip2, unzip, uncompress
그래서 저는 Execute_unpacking이라는 함수를 작성했습니다.
#!/bin/bash
exectute_unpacking(){
for FILE in "${@}"
do
local FILE_TYPE=$(file "${FILE}")
# How to get the compression type of the file?
case "${FILE_TYPE}" in
*bzip2) bunzip2 ${RECURSIVE} "${FILE}" ;;
*gzip) gunzip ${RECURSIVE} "${FILE}" ;;
*Zip) unzip ${RECURSIVE} ${FILE} ;;
*compress) uncomprees ${RECURSIVE} ${FILE} ;;
?) echo "${FILE} cannot be extarcted" ;;
esac
done
}
따라서 $(file ${FILE})을 기반으로 Zip, bzip2, 압축, gzip을 확인해야 합니다.
이것이 올바른 접근 방식입니까? (dtrx와 같은 외부 도구를 사용하고 싶지 않습니다)
예를 들어 파일이 4개 있다면 다음과 같습니다.
$(file -i archive) => archive: text/plain; charset=us-ascii
$(file -i archive.bz2) => archive.bz2: application/x-bzip2; charset=binary
$(file -i archvive.gz) =>archive.gz: application/x-gzip; charset=binary
$(file -i archive.cmpr) => archive.cmpr: application/x-compress; charset=binary
따라서 FILE_TYPE 변수 4개 옵션 gzip, 압축, bzip2, txt를 할당한 다음 사례 설명에 따라 이러한 패턴을 일치시켜야 합니다.
./unpack.sh archive.zip을 시도하면 불행히도 아무 일도 일어나지 않습니다.
도움을 주셔서 미리 감사드립니다!
답변1
노력하다:
local file_type=$(file -b "${FILE}" | awk '{print $1}')
그런 다음 XZ, gzip 등 또는 그것이 생성하는 모든 것을 테스트할 수 있습니다.
답변2
bsdtar
대부분의 아카이브 형식( tar
, tgz
, zip
, s...)을 자체적으로 추출 할 수 있는 libarchive를 사용하십시오 .iso
bsdtar -xf "$any_archive"
p
( //관련 권한, 소유권, 희소성 처리 와 같은 다른 옵션도 참조하세요 ).o
S
bsdcat
또는 대부분의 압축 형식( gz
, xz
, bz2
) 의 압축을 풀기 위한 libarchive
bsdcat -- "$compressed_file" > "$uncompressed_file"
이는 zip
단순한 압축 형식이 아니라 아카이브 형식이라는 점에 유의하세요. zip
프로필에는 여러 구성원이 포함되는 경우가 많습니다. bsdcat
그것들만 연결하겠습니다. 대신 bsdtar
그것을 추출하는 데 사용하십시오.