Linux 上無痛文件提取
從 Linux 系統的存檔中提取文件沒有拔牙那么痛苦,但有時看起來更復雜。在這篇文章中,我們將看看如何輕松地從 Linux 系統中可能遇到的幾乎所有類型的存檔中提取文件。
它們有很多格式,從 .gz 到 .tbz2,這些文件的命名方式都各有一些不同。當然,你可以記住所有從存檔中提取文件的各種命令以及它們的選項,但是你也可以將所有經驗保存到腳本中,而不再擔心細節。
在本文中,我們將一系列提取命令組合成一個腳本,它會調用適當的命令根據文檔名提取文件的內容。該腳本首先以一些命令來驗證是否已經提供了一個文件名作為參數,或要求運行腳本的人提供文件名。
- #!/bin/bash
- if [ $# -eq 0 ]; then
- echo -n "filename> "
- read filename
- else
- filename=$1
- fi
- if [ ! -f "$filename" ]; then
- echo "No such file: $filename"
- exit $?
- fi
了解了么?如果未提供任何參數,腳本將提示輸入文件名,如果存在則使用它。然后,它驗證文件是否實際存在。如果不是,那么腳本退出。
下一步是使用 bash 的 case 語句根據存檔文件的名稱調用適當的提取命令。對于其中某些文件類型(例如 .bz2),也可以使用除 tar 之外的其它命令,但是對于每種文件命名約定,我們僅包含一個提取命令。因此,這是帶有各種存檔文件名的 case 語句:
- case $filename in
- *.tar) tar xf $filename;;
- *.tar.bz2) tar xjf $filename;;
- *.tbz) tar xjf $filename;;
- *.tbz2) tar xjf $filename;;
- *.tgz) tar xzf $filename;;
- *.tar.gz) tar xzf $filename;;
- *.gz) gunzip $filename;;
- *.bz2) bunzip2 $filename;;
- *.zip) unzip $filename;;
- *.Z) uncompress $filename;;
- *) echo "No extract option for $filename"
- esac
如果提供給腳本的文件擴展名與腳本已知的擴展名都不匹配,那么會發出 “No extract option for $filename” 的消息。如果缺少你使用的任何存檔類型,只需將它們與所需的提取命令一起添加即可。
將 bash 頭添加到腳本頂部,使其可執行,然后就可以開始了。
- #!/bin/bash
- if [ $# -eq 0 ]; then
- echo -n "filename> "
- read filename
- else
- filename=$1
- fi
- if [ ! -f "$filename" ]; then
- echo "No such file: $filename"
- exit $?
- fi
- case $filename in
- *.tar) tar xf $filename;;
- *.tar.bz2) tar xjf $filename;;
- *.tbz) tar xjf $filename;;
- *.tbz2) tar xjf $filename;;
- *.tgz) tar xzf $filename;;
- *.tar.gz) tar xzf $filename;;
- *.gz) gunzip $filename;;
- *.bz2) bunzip2 $filename;;
- *.zip) unzip $filename;;
- *.Z) uncompress $filename;;
- *.rar) rar x $filename ;;
- *)
如果你希望腳本在提取文件時顯示內容,請將詳細選項(-v)添加到每個命令參數字符串中:
- #!/bin/bash
- if [ $# -eq 0 ]; then
- echo -n "filename> "
- read filename
- else
- filename=$1
- fi
- if [ ! -f "$filename" ]; then
- echo "No such file: $filename"
- exit $?
- fi
- case $filename in
- *.tar) tar xvf $filename;;
- *.tar.bz2) tar xvjf $filename;;
- *.tbz) tar xvjf $filename;;
- *.tbz2) tar xvjf $filename;;
- *.tgz) tar xvzf $filename;;
- *.tar.gz) tar xvzf $filename;;
- *.gz) gunzip -v $filename;;
- *.bz2) bunzip2 -v $filename;;
- *.zip) unzip -v $filename;;
- *.Z) uncompress -v $filename;;
- *) echo "No extract option for $filename"
- esac
總結
雖然可以為每個可能用到的提取命令創建別名,但是讓腳本為遇到的每種文件類型提供命令要比自己停下來編寫每個命令和選項容易。