tar
tape archives, 파일을 묶는 데 사용되며 파일 형식은 이식성이 뛰어납니다.
패키징 (또는 아카이빙, 압축하지 않으므로):
# -c创建文件,-f指定文件名
tar -cf bundle.tar file1 file2...
# 支持通配符
tar -cf bash_bundle.tar "*.sh"
추가:
# -r向已存在的包中添加一个文件
tar -rf bash_bundle.tar new.sh
# 对比时间戳,比同名文件新的话才添加
# vv是为了输出详细日志,没有就表示文件不新,没往进塞
tar -uvvf bash_bundle.tar new.sh
삭제:
# --delete删除包里的文件
tar -f sh.tar --delete test.sh
P.S. Mac에서는 --delete 옵션이 없습니다.
확인:
# -t查看包内容
tar -tf bash_bundle.tar
# -v看详细点的(文件权限、修改日期,类似于ls -l)
tar -tvf bash_bundle.tar
# -vv看更详细的(比上面多一行包文件格式信息)
tar -tvvf bash_bundle.tar
P.S. -v와 -vv는 다른 옵션과 함께 사용하여 로그를 출력할 수 있습니다.
추출 (압축 해제):
# -x提取到当前目录
tar -xf bash_bundle.tar
# -C提取到指定目录(目录必须已存在,否则报错)
tar -xf bash_bundle.tar -C ./tmp
# 只提取指定文件
tar -C ./tmp -xf bash_bundle.tar ab.diff
신기한 팁:
# stdin/stdout
# 把打包结果输出到stdout
tar -cf - test.sh
# 从stdin读取包内容
tar -xf - -C ./tmp test.sh
ssh와 조합하면 파이프로 원격 머신에 바로 연결하여 파일을 일괄 전송할 수 있습니다.
# 本地打包,远程提取(用来同步目录)
tar -cf - test.sh | ssh <user>@<IP> "mkdir -p ~/tmp/sh; tar -xf - -C ~/tmp/sh"
# 本地打包,远程保存(用来批量上传文件)
tar -cf - test.sh | ssh jiajiejie.jj@10.125.1.214 "mkdir -p ~/tmp; cat > ~/tmp/sh.tar"
# 把远程文件提取到本地(用来批量下载文件)
ssh jiajiejie.jj@10.125.1.214 "cat ~/tmp/sh.tar" | tar -xf - -C ./tmp
중간 파일을 줄이고 디스크 읽기/쓰기를 최소화하여 효율성이 더 높습니다.
tar는 기본적으로 아카이빙만 수행하며, 파일을 묶을 뿐 압축하지는 않지만, 압축 옵션도 제공합니다.
# -z压缩为zip格式
tar -a -cf bash.tar.gz "*.sh"
# -j压缩为bunzip2格式
tar -a -cf bash.tar.bz2 "*.sh"
# --lzma压缩为lzma格式(Mac下没有该选项)
tar -a -cf bash.tar.lzma
tar -a -cf filename.tar.lzo
-a/--autocompress 옵션은 위 예시처럼 파일 이름에 따라 압축 형식을 자동으로 선택합니다. 압축을 해제할 때는 압축 형식을 지정해야 하며, 일반적인 컴파일 설치 방법은 다음과 같습니다.
# 下载源码
wget http://path/to/source.tar.gz
# 解压
tar -zxvf source.tar.gz
# 或者,-a自动检测压缩格式
tar -axvf source.tar.gz
# 三板斧
cd source
./configure
make
make install
기타 옵션 및 사용법:
# -A合并包(把2合并到1)
tar -Af bundle1.tar bundle2.tar
# -d比较包里外的文件
tar -df sh1.tar test.sh
# --exclude排除指定文件(排除md文件)
tar -cf bundle.tar "*" --exclude "*.md"
# 或者把需要排除的文件名写入文件,通过-X选项排除
echo "*.md" > tar.ignore
tar -cf bundle.tar "*" -X tar.ignore
# 排除版本控制目录(.git, .svn之类的)
tar --exclude-vcs -zcvf proj.tar.gz ./proj
# --totals输出包文件大小
tar -zcvf dir.tar.gz "*" --totals
P.S. Mac에서는 -d, --totals 옵션이 없으며, 낮은 버전의 tar는 --exclude-vcs를 지원하지 않습니다.
cpio
tar와 유사하게 stdin에서 입력 파일 이름을 받고 패키징된 파일을 stdout으로 출력합니다. 주로 rpm 패키지에 사용되며 자주 쓰이지는 않습니다.
특징은 절대 경로를 지원한다는 점입니다. tar는 패키징 시 절대 경로를 상대 경로로 변환하지만, cpio는 변환하지 않습니다. 패키징 시 절대 경로를 입력하면 추출 시에도 절대 경로로 복구되고, 그렇지 않으면 tar와 마찬가지로 현재 디렉터리에 추출됩니다.
# 只能从stdin接收文件名
# 打包,-o指定输出文件名,-v输出文件列表
find . -name "*.sh" -print | cpio -ov > bash.cpio
# 查看,-i指定输入包名,-t列出包内容
cpio -vit < bundle.cpio
# 提取,-d表示提取操作
cpio -vid < bundle.cpio
주의: cpio는 파일 덮어쓰기 시 별도의 안내가 없으므로, 절대 경로에 해당하는 파일이 이미 존재하고 더 오래된 파일이라면 경고 없이 교체됩니다. 추출 시 타임스탬프를 자동으로 비교하여 보관된 파일이 더 최신인 경우에만 교체하고, 그렇지 않으면 추출을 건너뜁니다.
P.S. cpio로 rpm 패키지를 풀려면 먼저 rpm 패키지를 cpio 패키지로 변환해야 하며, rpm2cpio 도구가 필요합니다.
gzip/gunzip, zcat
이 3가지 명령은 모두 gzip 압축 파일을 처리할 수 있습니다. gzip 명령은 단일 파일만 압축할 수 있으며 디렉터리나 여러 파일을 직접 처리할 수 없습니다. 따라서 일반적으로 먼저 tar 명령으로 묶은 다음 gzip으로 압축합니다.
gzip/gunzip
압축:
# 会删除test.sh,再生成test.sh.gz
gzip test.sh
압축 해제:
# 删除test.sh.gz,生成test.sh
gunzip test.sh.gz
확인:
# -l列出包内文件名、压缩前后大小、压缩比
gzip -l test.sh.gz
stdin/stdout과 함께 사용할 수도 있습니다.
# -c输出到stdout
cat sub.sh | gzip -c > sub.sh.gz
이렇게 하면 원본 파일인 sub.sh를 보존할 수 있습니다.
기타 옵션 및 사용법:
# --fast/--best指定压缩级别,分别对应最低/最高压缩比
# 一共有9级,--fast对应1,--best对应9
gzip test.sh --fast
# 等价于
gzip test.sh -1
# tar的-z选项使用gzip压缩
tar -zcvf bash.tar.gz "*.sh"
# 或者,-a自动检测压缩格式
tar -acvf bash.tar.gz "*.sh"
# 或者,先打包再压缩
tar -cvf bash.tar "*.sh"; gzip bash.tar
zcat
압축을 풀지 않고 gzip 압축 파일의 내용을 직접 읽어 stdout으로 출력합니다.
# 读取gz文件内容
zcat test.sh.gz
P.S. Mac에서 zcat은 입력 파일 이름 뒤에 강제로 .Z 확장자를 붙여 오류를 발생시킵니다.
zcat: can't stat: sub.sh.gz (sub.sh.gz.Z): No such file or directory
따라서 이식성을 보장하기 위해 zcat 사용은 권장하지 않으며, gunzip -c로 대체할 수 있습니다. 자세한 정보는 zcat on OS X always appends a .Z to the filename (better use gunzip -c)를 확인하세요.
bzip2/bunzip2
일반적으로 gzip보다 압축률이 더 높으며, 사용법은 gzip과 완전히 동일합니다.
# 压缩
# 会删除test.sh,生成test.sh.bz2
bzip2 test.sh
# 解压
bunzip2 test.sh.bz2
실제 테스트 결과 텍스트 파일인 test.sh의 경우, 동일하게 최대 압축 수준(-9)을 적용했을 때 bzip2가 gzip보다 압축률이 약간 더 낮았습니다.
-rwxr-xr-x 1 ayqy staff 1064 4 9 16:31 test.sh
-rwxr-xr-x 1 ayqy staff 682 4 9 16:31 test.sh.bz2
-rwxr-xr-x 1 ayqy staff 632 4 9 16:31 test.sh.gz
마찬가지로 gzip이 제공하는 기능은 bzip2에서도 거의 모두 지원됩니다.
# 指定压缩级别
bzip2 -1 test.sh
# tar -j选项压缩成bz2
tar -jcvf bash.tar.gz "*.sh"
# ...同gzip
또한 bzip2만의 고유한 기능이 있습니다 (gzip에는 없음).
# -k保留输入文件
bzip2 -k test.sh
P.S. lzma/unlzma라는 비교적 최신 압축 도구도 있습니다. 압축률이 더 높다고 알려져 있으며, 기본적으로 설치되어 있지 않은 경우가 많아 수동으로 설치해야 합니다. 사용법은 gzip/bzip2와 같으며 두 도구의 모든 옵션을 지원합니다.
zip
매우 흔한 압축 형식으로, 압축률이 아주 높지는 않지만 많은 네트워크 리소스가 이 형식을 사용합니다.
압축:
# 生成test.sh.zip,不删除test.sh
zip test.sh.zip test.sh
# -r递归处理目录
zip -r bundle.zip .
압축 해제:
# 解压到当前目录,不会删除test.sh.zip
unzip test.sh.zip
대상 파일이 이미 존재하면 교체/이름 변경/취소 여부를 묻는 메시지가 나타납니다.
업데이트:
# -u用新文件替掉包里的
zip test.sh.zip -u test.sh
삭제:
# -d删除包里指定文件
zip -d test.sh.zip test.sh
확인:
# -l列出包内容
unzip -l test.sh.zip
암호화/인코딩
리눅스는 crypt, gpg, base64 등 다양한 암호화/인코딩 도구를 제공합니다.
crypt
stdin으로부터 파일 입력과 비밀번호를 받아 암호화 결과를 stdout으로 출력합니다.
암호화:
# 交互提示输入口令
crypt < test.sh
# 把加密结果重定向到文件
crypt < test.sh > test.lock.sh
복호화:
# 同样,只接受来自stdin的,只输出到stdout
crypt 口令 < test.lock.sh > test.sh
P.S. Mac에는 이 명령이 없습니다.
gpg
GNU Privacy Guard로 키 서명 방식을 사용하며, 간단한 사용법은 다음과 같습니다.
# 加密,交互提示输入口令,生成test.sh.gpg
gpg -c test.sh
# 解密,交互提示输入口令
gpg test.sh.gpg
P.S. Mac에는 이 명령이 없습니다.
base64
위 두 명령과 달리 디코딩이 매우 쉽기 때문에 일반 텍스트와 큰 차이가 없으며, 단순히 인코딩 방식으로 간주됩니다.
# 编码
base64 test.sh > test.sh.base64
# 解码
base64 -D test.sh.base64 > test.sh
rsync
rsync는 시스템 스냅샷을 백업하는 데 사용됩니다. 자체적으로 diff 및 압축 메커니즘을 갖추고 있어 scp 등의 명령보다 효율적입니다. 또한 네트워크 데이터 전송을 지원하며 원격지와 로컬의 파일을 비교하여 업데이트된 내용만 복사합니다. 암호화 옵션도 지원합니다.
백업:
# 备份到本地
# 在当前目录创建bash.bak/bash,复制下面所有内容
# -a归档,-v输出log
rsync -av bash bash.bak
# 备份到远程
rsync -av bash ayqy@<IP>:~/bak
주의: 경로 형식에 유의해야 합니다. 소스 경로 끝에 /가 있으면 그 아래의 모든 파일/하위 파일을 대상 경로로 복사하고, 그렇지 않으면 대상 경로에 해당 폴더를 생성한 후 복사합니다. 한마디로 /가 있으면 폴더를 생성하지 않으며, 대상 경로 끝의 /도 비슷한 의미를 가집니다.
정기 백업은 동일한 명령을 주기적으로 실행하기만 하면 되며, 차이점과 업데이트를 자동으로 확인하여 백업합니다.
복구:
# 从本地恢复
rsync -av bash.bak bash
# 从远端恢复
rsync -av ayqy@<IP>:~/bak bash
교환 매개변수 위치만 바꾸면 됩니다.
기타 옵션 및 기능:
# -z压缩传输
rsync -zav bash bash.bak
# --exclude排除指定文件
rsync -av bash bash.bak --exclude "*.md"
# --delete备份时删除不存在的文件,默认不会删掉源端已经删掉的东西
rsync -av bash bash.bak --exclude --delete
아직 댓글이 없습니다