bash에서 bzip gzip zip 사용

bash에서 bzip gzip zip 사용
#!/bin/bash

# check if the user put a file name
if [ $# -gt 0 ]; then

    # check if the file is exist in the current directory
    if [ -f "$1" ]; then

        # check if the file is readable in the current directory
        if [ -r "$1" ]; then
            echo "File:$1"
            echo "$(wc -c <"$1")"

            # Note the following two lines
            comp=$(bzip2 -k $1)
            echo "$(wc -c <"$comp")"
        else
            echo "$1 is unreadable"
            exit
        fi
    else
        echo "$1 is not exist"
        exit
    fi
fi

$1현재 내 문제는 bzip을 통해 파일을 단일 파일로 압축 할 수 있다는 것인데 $1.c.bz2, 압축 파일의 크기를 캡처하면 어떻게 되나요? 내 코드에는 그러한 파일이 표시되지 않습니다.

답변1

나는 당신을 위해 코드를 정리했습니다:

#!/bin/bash

#check if the user put a file name
if [ $# -gt 0 ]; then
    #check if the file is exist in the current directory
    if [ -f "$1" ]; then
        #check if the file is readable in the current directory
        if [ -r "$1" ]; then
            echo "File:$1"
            echo "$(wc -c <"$1")"
            comp=$(bzip2 -k $1)
            echo "$(wc -c <"$comp")"
        else
            echo "$1 is unreadable"
            exit
        fi
    else
        echo "$1 is not exist"
        exit
    fi
fi

fi마지막에서 두 번째 줄의 추가 내용을 확인하세요.

bzip2 -k test.file이제 11번째 줄은 출력이 생성되지 않기 때문에 의미가 없습니다 . 따라서 변수는 comp비어 있습니다.

쉬운 방법은 확장이 무엇인지 간단히 아는 .bz2것이므로 다음과 같이 할 수 있습니다.

            echo "$(wc -c <"${1}.bz2")"

comp그리고 변수는 전혀 사용되지 않습니다.

답변2

bzip2 -k아무 것도 출력되지 않으므로 명령 대체로 실행하고 변수에 출력을 캡처하면 comp해당 변수가 비어 있게 됩니다. 이 빈 변수가 주요 문제입니다. 이 방법을 사용하는 것은 파일 크기를 무작위로 가져오는 것 stat보다 낫습니다 . 파일에서 모든 데이터를 읽어야 하는 번거로움보다는 파일의 메타데이터에서 파일 크기만 읽는 것이 더 효율적이기 때문입니다.wc -cstat

또한 스크립트 작성에 방해가 되는 파일 존재 여부 및 가독성에 대한 불필요한 검사가 많이 있습니다. 이러한 검사는 bzip2어쨌든 수행되며 이 사실을 활용하여 대부분의 검사를 직접 테스트하지 않아도 됩니다.

제안:

#!/bin/sh

pathname=$1

if ! bzip2 -k "$pathname"; then
    printf 'There were issues compressing "%s"\n' "$pathname"
    echo 'See errors from bzip2 above'
    exit 1
fi >&2

size=$( stat -c %s "$pathname" )
csize=$( stat -c %s "$pathname.bz2" )

printf '"%s"\t%s --> %s\n' "$pathname" "$size" "$csize"

스크립트는 종료 상태를 사용하여 bzip2파일 압축이 성공했는지 여부를 확인합니다. 실패하면 bzip2터미널에 이미 생성된 진단 메시지를 보완하는 진단 메시지를 인쇄합니다.

-k압축되지 않은 파일을 보존하기 위해 with 를 사용하고 있으므로 bzip2명령문 다음에 두 파일의 크기를 모두 얻을 수 있습니다 if. -k명령에서 제거 하려면 당연히 if명령문 앞에 압축되지 않은 파일의 크기를 가져와야 합니다.

스크립트에 사용된 방법은 stat스크립트가 Linux 시스템에서 실행되고 있다고 가정합니다. 이 stat유틸리티는 비표준이며 다른 시스템의 다른 옵션과 함께 구현됩니다. 예를 들어 macOS 또는 OpenBSD stat -f %z에서는 stat -c %s.

시험:

$ ./script
bzip2: Can't open input file : No such file or directory.
There were issues compressing ""
See errors from bzip2 above
$ ./script nonexisting
bzip2: Can't open input file nonexisting: No such file or directory.
There were issues compressing "nonexisting"
See errors from bzip2 above
$ ./script file
"file"  600 --> 43
$ ./script file
bzip2: Output file file.bz2 already exists.
There were issues compressing "file"
See errors from bzip2 above
$ rm -f file.bz2
$ chmod u-r file
$ ./script file
bzip2: Can't open input file file: Permission denied.
There were issues compressing "file"
See errors from bzip2 above

관련 정보