#!/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 -c
stat
또한 스크립트 작성에 방해가 되는 파일 존재 여부 및 가독성에 대한 불필요한 검사가 많이 있습니다. 이러한 검사는 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