我可以肯定,我不是唯一一个存在以下问题的人:每次我需要在* nix中解压缩文件时,我都不记得所有的开关了,最终对其进行了谷歌搜索,这令人惊讶地考虑到我需要多久进行一次做这个。
你有一个好的压缩备忘单吗?或为tar中所有这些令人讨厌的开关提供助记符?
我将这篇文章做成Wiki,以便我们在这里创建一个不错的备忘单。
哦,关于手册页:有没有一件事对他们没有帮助,那是为了弄清楚如何解压缩文件。
我可以肯定,我不是唯一一个存在以下问题的人:每次我需要在* nix中解压缩文件时,我都不记得所有的开关了,最终对其进行了谷歌搜索,这令人惊讶地考虑到我需要多久进行一次做这个。
你有一个好的压缩备忘单吗?或为tar中所有这些令人讨厌的开关提供助记符?
我将这篇文章做成Wiki,以便我们在这里创建一个不错的备忘单。
哦,关于手册页:有没有一件事对他们没有帮助,那是为了弄清楚如何解压缩文件。
Answers:
或者如何使用具有高级完成功能(如zsh或bash的新版本)的shell,它将在全面的帮助下为您完成这些选项?:))
关于tar:只需查看“ qwerty”键盘即可。彼此之间有字母“ zxcvf”。您需要“ tar czvf file.tar.gz文件”或“ tar xzvf file.tar.gz”。
z
选项(或文件j
选项.bz2
)。它会自动解压缩文件。
有一个小的Perl脚本叫做“ unp”。
unp filename.tar.gz
...然后提取所有内容。只要您拥有正确的二进制文件,就可以与任何压缩文件一起使用。而您只是忘记了语法或其他任何废话。检查Linux发行版的存储库。它应该在那里(至少在Arch,Debian和Ubuntu上)。
确实经常使用,所以我在提取(x)数据和压缩(c)数据之间有所不同:
提取:
tar xzf data.tgz
压缩:
tar czf data.tgz
此外,您也可以在.bashrc中添加两个功能:
function extract () {
if ($# -ne 1); then
echo "Usage: $0 `<compressed archive>"`
exit 1
fi
tar xzf $1
}
function compress () {
if ($# -ne 2); then
echo "Usage: $0 `<compressed archive> <files|directories>"`
exit 1
fi
tar czf $1 $2
}
还有另一个不错的提取功能,它可以检测压缩文件的扩展名并为您完成工作:
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know how to extract '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}
只需输入tar --help
,便有您的备忘单。
如果您在记住tar选项时遇到麻烦,请尝试使用管道:
zcat file.tar.gz | tar xvf -
bzcat file.tar.bz2 | tar xvf -
更换tar xv
用tar tv
刚刚查看压缩包中的内容。
我个人使用以下助记符:
尽管“ j”和“ bzip2”似乎彼此无关,但我很容易记住此异常。
另外,我对Google取代“ man tar”感到很有趣。
f
选项的习惯:直到最近,tar的发行版默认为f -
,历史默认值为f /dev/rmt0
或类似。毕竟,tar是Tape ARchiver。
我90%的时间都在使用
tar -xvf file.*
x:解压缩
v:冗长(可选)
f:输入文件(tar,gz,bzip2等)
容易吧?:)
使用Fileroller,如果您不在控制台中,请使用Ark。
我一直在使用一个Perl脚本调用aunpack
,该部分atool项目,很多年了。因此,您只需运行:aunpack foo.{zip/tar.gz/tar.bz2}
它就会基于文件扩展名执行正确的操作。
的另一个好处aunpack
是,它不会污染很多文件的当前目录。假设其中有20个文件foo.zip
不在子目录中。与其在当前目录中喷出这些文件,不如aunpack
创建一个foo
子目录并将所有文件放在其中。
您需要做的只是tar x
(从stdin提取),tar c
(tar到stdout),gzip -c
(从stdin到stdout的gzip;-1
到-9
压缩级别;同样适用bzip2
)和gunzip -c
(从stdin到stdout的gunzip)-其他一切都是管道。
要tar和gzip:
$ tar c * | gzip -c > out.tar.gz
解压缩和解压缩
$ gunzip -c < out.tar.gz | tar x
如果您想要进度条,请使用与cat类似的pv,但显示进度条:
$ tar c * | bzip2 -c | pv > out.tar.gz
22.6MiB 0:00:03 [3.64MiB/s] [ <=> ]
$ pv in.tar.gz | bunzip2 -c | tar x
80MiB 0:00:00 [ 58MiB/s] [===============================>] 100%