メインコンテンツへ移動

アーカイブ・圧縮・暗号化・バックアップ_bashノート6

無料2017-04-09#Tool#linux备份#linux加密#zip与gzip#tar -zxvf

ファイルの運び屋

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. cpiorpmパッケージを展開するには、まず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)では、bzip2gzipよりも圧縮率がわずかに低いことが分かりました:

    -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

また、いくつかの独自の特性(gzipにはなくbzip2にあるもの)があります:

# -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

加密/编码

Linuxは多くの暗号化/エンコードツールを提供しています:cryptgpgbase64など。

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

上記2つのコマンドとは異なり、デコードが容易で平文とほぼ変わらないため、エンコード方式の一つと見なされます:

# 编码
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

コメント

コメントはまだありません

コメントを書く