고급 Bash 스 크 립 트 프로 그래 밍 가이드 (28): 파일 과 압축 파일 명령 (1)
18712 단어 shell
견지했어
압축 파일 명령
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
계속
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.