고급 Bash 스 크 립 트 프로 그래 밍 가이드 (28): 파일 과 압축 파일 명령 (1)

18712 단어 shell
고급 Bash 스 크 립 트 프로 그래 밍 가이드 (28): 파일 과 압축 파일 명령 (1)
견지했어
압축 파일 명령
tar
표준 UNIX 압축 파일 도구 입 니 다. 처음에는 테이프 압축 파일 프로그램 이 었 으 나 현 재 는 유 니 버 설 압축 파일 프로그램 으로 개발 되 었 습 니 다. 테이프 장치, 정상 파일, 심지어 stdout 을 포함 한 모든 종류의 압축 파일 을 처리 할 수 있 습 니 다. GNU tar 공 구 는 현재 다양한 종류의 압축 필 터 를 받 아들 일 수 있 습 니 다.
예 를 들 어 tar czvf archivename. tar. gz *, 압축 파일 을 재 귀적 으로 처리 할 수 있 으 며, 디 렉 터 리 에 있 는 모든 파일 을 gzip 으로 압축 할 수 있 습 니 다. 현재 디 렉 터 리 에 있 는 ($PWD) 점 파일 을 제외 하고. 
일부 유용 한 tar 명령 옵션: - c 생 성 (새 압축 파일) - x 압축 해제 파일 (존재 하 는 압축 파일 에서) -- delete 파일 삭제 (존재 하 는 압축 파일 에서)
이 옵션 은 테이프 형식 장치 에 사용 할 수 없습니다. - r 는 기 존 압축 파일 의 끝 에 파일 을 추가 합 니 다. - A 는 tar 파일 을 기 존 압축 파일 의 끝 에 추가 합 니 다. - t 열 에 저 장 된 압축 파일 에 포 함 된 내용 - u 업데이트 압축 파일 - d 는 지정 한 파일 시스템 을 사용 합 니 다. 압축 파일 - z 는 gzip 으로 압축 파일 을 압축 합 니 다.(압축 또는 압축 해제, 조합 여부 - c 또는 - x) 옵션 - j 는 bzip 2 로 압축 파일 을 압축 합 니 다.
손 상 된 gzip 으로 압축 된 tar 파일 에서 데 이 터 를 얻 으 려 면 매우 어 려 울 것 입 니 다. 따라서 중요 한 파일 을 압축 할 때 여러 개의 백업 을 보관 해 야 합 니 다.
내 가 사용 하 는 압축 풀기, 압축 명령 집합 공유:http://blog.csdn.net/xinyuwuxian/article/details/8872730 O(∩_∩)O~
shar
셸 압축 파일 도구 입 니 다. 셸 압축 파일 에 존재 하 는 모든 파일 은 압축 되 지 않 았 으 며, 본질 적 으로 셸 스 크 립 트 입 니 다.\#!/bin/sh 로 시작 하고 필요 한 압축 파일 해제 명령 을 포함 합 니 다. Shar 압축 파일 은 아직 까지 인터넷 뉴스 그룹 에서 사용 되 고 있 습 니 다. 그렇지 않 으 면 shar 는 tar/gzip 으로 대 체 됩 니 다. unshar 명령 은 shar 압축 파일 을 푸 는 데 사 용 됩 니 다.
ar
압축 파일 을 만 들 고 조작 하 는 도 구 는 바 이 너 리 대상 파일 을 라 이브 러 리 로 포장 할 때 만 사용 합 니 다.
rpm
Red Hat 패키지 관리자 또는 rpm 도 구 는 원본 파일 이나 바 이 너 리 파일 을 포장 하 는 방법 을 제공 합 니 다. 이 밖 에 설치 명령 도 포함 되 어 있 으 며 패키지 의 완전 성 을 검사 합 니 다.
간단 한 rpm - i package name. rpm 명령 은 가방 을 설치 하 는 것 만으로 도 충분 합 니 다. 비록 이 명령 은 다른 옵션 이 많 지만.
rpm - qf 는 그 가방 에 속 하 는 파일 을 보 여 줍 니 다.
bash$ rpm -qf /bin/ls
coreutils-5.2.1-31
rpm - qa 는 주어진 시스템 에 설 치 된 rpm 패 키 지 를 보 여 줍 니 다. rpm - qa package name 명령 은 주어진 이름 package name 과 일치 하 는 패 키 지 를 보 여 줍 니 다.
bash$ rpm -qa
redhat-logos-1.1.3-1
 glibc-2.2.4-13
 cracklib-2.7-12
 dosfstools-2.7-1
 gdbm-1.8.0-10
 ksymoops-2.4.1-1
 mktemp-1.5-11
 perl-5.6.0-17
 reiserfs-utils-3.x.0j-2
 ...


bash$ rpm -qa docbook-utils
docbook-utils-0.6.9-2


bash$ rpm -qa docbook | grep docbook
docbook-dtd31-sgml-1.0-10
 docbook-style-dsssl-1.64-3
 docbook-dtd30-sgml-1.0-10
 docbook-dtd40-sgml-1.0-11
 docbook-utils-pdf-0.6.9-2
 docbook-dtd41-sgml-1.0-10
 docbook-utils-0.6.9-2

계속 ubuntu, red hat 를 사용 하고 있 습 니 다. 거의 고려 범위 안에 있 지 않 습 니 다. O (∩ ∩) O ~, 여기 서 알 면 됩 니 다.
cpio
이 특수 한 압축 파일 복사 명령 (복사 입력 과 출력, copy input and output) 은 현재 거의 볼 수 없습니다. tar/gzip 으로 대체 되 었 기 때 문 입 니 다. 현재 이 명령 은 비교적 특수 한 곳 에서 만 사용 되 고 있 습 니 다. 예 를 들 어 디 렉 터 리 트 리 를 복사 합 니 다. 적당 한 크기 의 블록 (복사 용) 을 지정 하면 tar 명령 보다 빠 를 것 입 니 다.
#!/bin/bash

#   cpio      .

#   'cpio'   :
#       .        'tar'     .
#          'cp'  
#+           (     pipes   ,   )

ARGS=2
E_BADARGS=65

if [ $# -ne "$ARGS" ]
then
  echo "Usage: `basename $0` source destination"
  exit $E_BADARGS
fi

source=$1
destination=$2


find "$source" -depth | cpio -admvp "$destination"
#               ^^^^^         ^^^^^
#   'find' 'cpio' man           .


#   :
# -----

#           'find | cpio'        ($?)
#+                    .

exit 0
결과:
root@ubuntu:~/resource/shell-study/0622-2013# ./test1.sh /root/resource/shell-study/0621-2013/ /root/resource/shell-study/
/root/resource/shell-study//root/resource/shell-study/0621-2013/test1.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/test10.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/file.unx
/root/resource/shell-study//root/resource/shell-study/0621-2013/file-d
/root/resource/shell-study//root/resource/shell-study/0621-2013/test7.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/test6.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/test8.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/test2.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/file-u
/root/resource/shell-study//root/resource/shell-study/0621-2013/test4.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/test9.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/test3.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/file
/root/resource/shell-study//root/resource/shell-study/0621-2013/test5.sh
/root/resource/shell-study//root/resource/shell-study/0621-2013/
14 blocks
root@ubuntu:~/resource/shell-study/0622-2013# ls
test1.sh
root@ubuntu:~/resource/shell-study/0622-2013# cd ..
root@ubuntu:~/resource/shell-study# ls
0426-2013  0504-2013  0507-2013  0509-2013  0613-2013  0615-2013  0619-2013  0621-2013  root
0427-2013  0506-2013  0508-2013  0609-2013  0614-2013  0618-2013  0620-2013  0622-2013
root@ubuntu:~/resource/shell-study# cd root/resource/shell-study/0621-2013/
file       file-d     file-u     file.unx   test10.sh  test1.sh   test2.sh   test3.sh   test4.sh   test5.sh   test6.sh   test7.sh   test8.sh   test9.sh   
root@ubuntu:~/resource/shell-study# cd root/resource/shell-study/0621-2013/

rpm2cpio
이 명령 은 rpm 압축 파일 에서 cpio 압축 파일 을 풀 수 있 습 니 다.
    :    rpm    

#!/bin/bash
# de-rpm.sh:     'rpm'    

: ${1?"Usage: `basename $0` target-file"}
#     'rpm'         .


TEMPFILE=$$.cpio # Tempfile     "  "   .
# $$        ID.

rpm2cpio < $1 > $TEMPFILE #  rpm       cpio    .
cpio --make-directories -F $TEMPFILE -i #   cpio    .
rm -f $TEMPFILE #   cpio    .

exit 0

압축 명령
gzip
표준 GNU/UNIX 압축 도 구 는 비교적 나 쁜 copress 명령 을 대체 합 니 다. 해당 하 는 압축 해제 명령 은 gunzip 이 고 gzip - d 와 등가 입 니 다.
- c 옵션 은 gzip 의 출력 을 stdout 에 인쇄 합 니 다. 파 이 프 를 통 해 다른 명령 에 전달 하고 싶 을 때 유용 합 니 다.
zcat 필 터 는 gzip 파일 을 stdout 에 압축 해제 할 수 있 기 때문에 가능 한 한 파이프 와 방향 을 바 꿀 수 있 습 니 다. 이 명령 은 사실상 압축 파일 (오래된 copress 도 구 를 사용 하여 압축 한 파일 포함) 에서 작업 할 수 있 는 cat 명령 입 니 다. zcat 명령 은 gzip - dc 와 같 습 니 다.
일부 비 즈 니스 UNIX 시스템 에 서 는 zcat 와 uncompress - c 가 등가 이 며 gzip 파일 에서 작업 할 수 없습니다.
bzip2
압축 에 사용 할 선택 할 수 있 는 도구 입 니 다. 보통 gzip 명령 보다 압축 률 이 높 습 니 다 (그래서 더 느 립 니 다). 비교적 큰 파일 에 적 용 됩 니 다. 해당 하 는 압축 해제 명령 은 bunzip 2 입 니 다.
compress, uncompress
이것 은 오래된, 개인 적 인 압축 도구 입 니 다. 일반적인 비 즈 니스 UNIX 발행 판 에는 이 도구 가 있 습 니 다. 더욱 효율 적 인 gzip 도 구 는 이미 이 도 구 를 교체 하 였 습 니 다. Linux 발행 판 에는 일반적으로 호 환 되 는 copress 명령 이 포함 되 어 있 습 니 다. gunzip 도 copress 도구 로 압축 된 파일 을 풀 수 있 지만.
znew 명령 은 압축 된 파일 을 gzip 압축 된 파일 로 변환 할 수 있 습 니 다.
sq
다른 압축 도구 입 니 다. 순서 만 있 는 ASCII 단어 목록 에서 만 작업 할 수 있 는 필터 입 니 다. 이 명령 은 필터 표준 호출 문법 을 사용 합 니 다. sq < input - file > output - file. 속도 가 빠 르 지만 효율 은 gzip 에 훨씬 못 미 칩 니 다. 해당 하 는 압축 해제 명령 은 unsq 입 니 다. 호출 방법 은 sq 와 같 습 니 다.
sq 의 출력 은 파 이 프 를 통 해 gzip 에 전달 하여 진일보 한 압축 을 편리 하 게 할 수 있다.
zip, unzip
크로스 플랫폼 의 파일 압축 파일 과 압축 도 구 는 DOS 의 pkzip. exe 와 호 환 됩 니 다. "Zip"압축 파일 은 인터넷 에서 "tar 패키지"보다 더 유행 하 는 것 같 습 니 다.
unarc, unarj, unrar
이 Linux 도 구 는 DOS 의 arc. exe, arj. exe, rar. exe 프로그램 으로 압축 된 파일 을 풀 수 있 습 니 다.
파일 정보
file
파일 형식 을 확인 하 는 도구 입 니 다. 명령 file - name 은 ascii 텍스트 나 데이터 형식 으로 file - name 파일 에 대한 자세 한 설명 을 되 돌려 줍 니 다. 이 명령 은/usr/share/magic,/etc/magic, 또는/usr/lib/magic 에서 정의 하 는 마법 숫자 로 어떤 마법 숫자 를 포함 하 는 파일 을 표시 합 니 다. 위 에 들 어 있 는 이 세 파일 은 구체 적 인 Linux/UNIX 발행 판 에 의존 해 야 합 니 다.
- f 옵션 을 사용 하면 file 명령 을 일괄 처리 모드 에서 실행 합 니 다. 즉, - f 뒤에 지정 한 파일 을 분석 하고 처리 해 야 할 파일 목록 을 읽 은 다음 file 명령 을 순서대로 실행 합 니 다. 
- z 옵션, 압축 된 대상 파일 을 사용 할 때 압축 된 파일 형식 을 강제로 분석 합 니 다.
bash$ file test.tar.gz
test.tar.gz: gzip compressed data, deflated, last modified: Sun Sep 16 13:34:51 2001, os: Unix

bash file -z test.tar.gz
test.tar.gz: GNU tar archive (gzip compressed data, deflated, last modified: Sun Sep 16 13:34:51 2001, os: Unix)
#!/bin/bash
#          sh Bash    :

DIRECTORY=/usr/bin
KEYWORD=Bourne
# Bourne Bourne-Again shell  

file $DIRECTORY/* | fgrep $KEYWORD

exit 0
결과:
root@ubuntu:~/resource/shell-study/0622-2013# ./test2.sh 
/usr/bin/aptitude-create-state-bundle:            Bourne-Again shell script text executable
/usr/bin/aptitude-run-state-bundle:               Bourne-Again shell script text executable
/usr/bin/cautious-launcher:                       Bourne-Again shell script text executable
/usr/bin/checkbox-gtk:                            Bourne-Again shell script text executable
/usr/bin/f-spot:                                  Bourne-Again shell script text executable
/usr/bin/f-spot-import:                           Bourne-Again shell script text executable
/usr/bin/lcf:                                     Bourne-Again shell script text executable
/usr/bin/ldd:                                     Bourne-Again shell script text executable
/usr/bin/net-snmp-config:                         Bourne-Again shell script text executable
/usr/bin/rarian-sk-config:                        Bourne-Again shell script text executable
/usr/bin/rarian-sk-extract:                       Bourne-Again shell script text executable
/usr/bin/rarian-sk-rebuild:                       Bourne-Again shell script text executable
/usr/bin/rarian-sk-update:                        Bourne-Again shell script text executable
/usr/bin/startx:                                  Bourne-Again shell script text executable
/usr/bin/tzselect:                                Bourne-Again shell script text executable
/usr/bin/ucf:                                     Bourne-Again shell script text executable
/usr/bin/ucfr:                                    Bourne-Again shell script text executable
/usr/bin/usb-devices:                             Bourne-Again shell script text executable
/usr/bin/vm-support:                              Bourne-Again shell script text executable
root@ubuntu:~/resource/shell-study/0622-2013# 
조금 어 려 운 실례 입 니 다. 여기 가 초보 자라 면 이 부분 을 연구 하지 말 것 을 권장 합 니 다.
#!/bin/bash
# strip-comment.sh:   C      (/*    */).

E_NOARGS=0
E_ARGERROR=66
E_WRONG_FILE_TYPE=67

if [ $# -eq "$E_NOARGS" ]
then
  echo "Usage: `basename $0` C-program-file" >&2 #        stderr.
  exit $E_ARGERROR
fi

#           .
type=`file $1 | awk '{ print $2, $3, $4, $5 }'`
# "file $1" echo      . . .
#   awk       ,       . . .
#            "type" .
correct_type="ASCII C program text"

if [ "$type" != "$correct_type" ]
then
  echo
  echo "This script works on C program files only."
  echo
  exit $E_WRONG_FILE_TYPE
fi


#      sed  :
#--------
sed '
/^\/\*/d
/.*\*\//d
' $1
#--------
#             sed    ,              .


#              ,          .
#+                  .
#            .

#    ,            "*/"      --
#+              .

exit 0


# ----------------------------------------------------------------
#          ,       'exit 0' .

# Stephane Chazelas         :

usage() {
  echo "Usage: `basename $0` C-program-file" >&2
  exit 1
}

WEIRD=`echo -n -e '\377'`   #   WEIRD=$'\377'
[[ $# -eq 1 ]] || usage
case `file "$1"` in
  *"C program text"*) sed -e "s%/\*%${WEIRD}%g;s%\*/%${WEIRD}%g" "$1" \
     | tr '\377
' '
\377' \ | sed -ne 'p;n' \ | tr -d '
' | tr '\377' '
';; *) usage;; esac # , : # printf("/*"); # # /* /* buggy embedded comment */ # # ( , \", \\" ... #+ ) C #+ ( lex yacc?). exit 0

which
which command - xxx 는 "command - xxx"의 전체 경 로 를 제공 합 니 다. 시스템 에서 특정한 명령 이나 도 구 를 정확하게 찾 으 려 면 이 명령 이 매우 유용 합 니 다.
root@ubuntu:~/resource/shell-study/0622-2013# which which
/usr/bin/which
root@ubuntu:~/resource/shell-study/0622-2013# 

whereis
위의 which 와 비슷 합 니 다. whereis command - xxx 는 'command - xxx' 의 전체 경 로 를 제공 할 뿐만 아니 라 이 명령 의 man 페이지 의 전체 경 로 를 제공 합 니 다.
root@ubuntu:~/resource/shell-study/0622-2013# whereis which
which: /bin/which /usr/bin/which /usr/share/man/man1/which.1.gz
root@ubuntu:~/resource/shell-study/0622-2013# 

whatis
whatis filexxx 는 whatis 데이터베이스 에서 "filexxx"를 조회 합 니 다. 시스템 명령 과 중요 한 설정 파일 을 확인 하고 싶 을 때 이 명령 은 매우 중요 합 니 다. 이 명령 을 간단 한 man 명령 으로 볼 수 있 습 니 다.
root@ubuntu:~/resource/shell-study/0622-2013# whatis which
which (1)            - locate a command
root@ubuntu:~/resource/shell-study/0622-2013# 

실례 를 하나 보다
#!/bin/bash

#    /usr/bin    2           ?

DIRECTORY="/usr/bin"

for file in $DIRECTORY/*
do
  whatis `basename $file`   #   echo   2       .
done

exit 0

#                 ,    :
# ./sh >>whatis.db
#         stdout   ,
# ./sh | less
결과:
root@ubuntu:~/resource/shell-study/0622-2013# ./test3.sh 
[ (1)                - check file types and compare values
2to3: nothing appropriate.
2to3-2.6: nothing appropriate.
a2p (1)              - Awk to Perl translator
abrowser: nothing appropriate.
aconnect (1)         - ALSA sequencer connection manager
acpi_fakekey (1)     - acpi event wrapper
acpi_listen (8)      - ACPI event listener
add-apt-repository (1) - Adds a repository into the /etc/apt/sources.list or /etc/apt/sources.list.d
addpart (8)          - simple wrapper around the "add partition" ioctl
addr2line (1)        - convert addresses into file names and line numbers.
alacarte (1)         - edit freedesktop.org menus
alsamixer (1)        - soundcard mixer for ALSA soundcard driver, with ncurses interface
amidi (1)            - read from and write to ALSA RawMIDI ports
amixer (1)           - command-line mixer for ALSA soundcard driver
......

vdir
자세 한 디 렉 터 리 목록 을 표시 합 니 다. ls - l 과 효과 가 비슷 합 니 다.
root@ubuntu:~/resource/shell-study/0622-2013# ls
test1.sh  test2.sh  test3.sh
root@ubuntu:~/resource/shell-study/0622-2013# vdir
total 12
-rwxr-xr-x 1 root root 700 2013-06-21 17:39 test1.sh
-rwxr-xr-x 1 root root 179 2013-06-21 18:05 test2.sh
-rwxr-xr-x 1 root root 357 2013-06-21 18:21 test3.sh
root@ubuntu:~/resource/shell-study/0622-2013# 

locate, slocate
locate 명령 은 미리 만들어 진 파일 데이터베이스 에서 파일 을 조회 합 니 다. slocate 명령 은 locate 의 보안 버 전 입 니 다. (locate 명령 은 slocate 명령 에 연결 되 었 을 가능성 이 높 습 니 다) $bash locate hickson/usr/lib/xephem/catalogs/hickson. edb
readlink
심 볼 릭 링크 가 가리 키 는 파일 을 표시 합 니 다.
root@ubuntu:~/resource/shell-study/0622-2013# readlink /usr/bin/awk 
/etc/alternatives/awk
root@ubuntu:~/resource/shell-study/0622-2013# 

strings
strings 명령 을 사용 하여 바 이 너 리 나 데이터 파일 에서 인쇄 가능 한 문 자 를 찾 습 니 다. 대상 파일 에 찾 을 수 있 는 모든 인쇄 가능 한 문자 의 순 서 를 표시 합 니 다. 이 명령 은 n 자 를 빠르게 찾 으 려 는 인쇄 검사 에 편리 하 며 알 수 없 는 형식의 그림 파일 을 검사 할 수도 있 습 니 다.(strings image - file | more 에서 JFIF 와 같은 문자열 을 검색 할 수 있 습 니 다. 이 파일 은 jpeg 형식의 그림 파일 임 을 의미 합 니 다) 스 크 립 트 에서 grep 또는 sed 명령 을 사용 하여 strings 명령 의 출력 을 분석 할 수 있 습 니 다. 인 스 턴 스: "개 선 된"strings 명령
#!/bin/bash
#
#                     
#+    "strings"     .
#                ,
#+              .

# ===========================================================
#                          
ARGS=1
E_BADARGS=65
E_NOFILE=66

if [ $# -ne $ARGS ]
then
  echo "Usage: `basename $0` filename"
  exit $E_BADARGS
fi

if [ ! -f "$1" ]                      #         .
then
    echo "File \"$1\" does not exist."
    exit $E_NOFILE
fi
# ===========================================================


MINSTRLEN=3                           #          .
WORDFILE=/usr/share/dict/words  #      .
#                  ,
#+                       .


wlist=`strings "$1" | tr A-Z a-z | tr '[:space:]' Z | \
tr -cs '[:alpha:]' Z | tr -s '\173-\377' Z | tr Z ' '`

#   'strings'              'tr'   .
#  "tr A-Z a-z"          .
#  "tr '[:space:]'"          Z.
#  "tr -cs '[:alpha:]' Z"             Z,
#+          Z.
#  "tr -s '\173-\377' Z"    z         Z.
#+          Z.
#+ (  173(123 ascii "{") 377(255 ascii       )  8  )
#+       ,                    
#+         Z .
#    "tr Z ' '"      Z      ,
#+                wlist             .

#  ****************************************************************
#    ,           'tr'         'tr' 
#+            .
#  ****************************************************************


for word in $wlist                    #   :
                                      # $wlist          .
                                      # "$wlist"       .
                                      #      ?
do

  strlen=${#word}                     #      .
  if [ "$strlen" -lt "$MINSTRLEN" ]   #        .
  then
    continue
  fi

  grep -Fw $word "$WORDFILE"          #         .
#      ^^^                            #  "     "  
                                      #+ "    "   .

done


exit $?
결과:
root@ubuntu:~/resource/shell-study/0622-2013# cat test1.sh 
#!/bin/bash

#   cpio      .

#   'cpio'   :
#       .        'tar'     .
#          'cp'  
#+           (     pipes   ,   )

ARGS=2
E_BADARGS=65

if [ $# -ne "$ARGS" ]
then
  echo "Usage: `basename $0` source destination"
  exit $E_BADARGS
fi

source=$1
destination=$2


find "$source" -depth | cpio -admvp "$destination"
#               ^^^^^         ^^^^^
#   'find' 'cpio' man           .


#   :
# -----

#           'find | cpio'        ($?)
#+                    .

exit 0
root@ubuntu:~/resource/shell-study/0622-2013# ./test4.sh test
test1.sh  test2.sh  test3.sh  test4.sh  
root@ubuntu:~/resource/shell-study/0622-2013# ./test4.sh test1.sh 
bin
bin's
bash
tar
tar's
pipes
then
echo
echo's
usage
usage's
source
source's
destination
destination's
exit
exit's
source
source's
destination
destination's
find
source
source's
depth
depth's
destination
destination's
find
find
exit
exit's
root@ubuntu:~/resource/shell-study/0622-2013#

먼저 여기까지, O (∩ ∩) O ~
내 칼럼 주소:http://blog.csdn.net/column/details/shell-daily-study.html
계속

좋은 웹페이지 즐겨찾기