1

私はこの必要性に何度か遭遇しましたが、さまざまな圧縮タイプのファイルを連結するための「最良の」方法を見つけるのがどれほど困難であったかに驚いています。

たとえば、ファイルcontent1content2.bz2、およびを含むディレクトリがありますcontent3.gz。すべてのファイルに対して同じ操作を実行したい場合は、最初に圧縮を確認して正しく解凍し、解凍してから操作を実行する必要があります。

それ以来、連結を「スマート」な方法で処理するスクリプトを作成しました。

#! /bin/bash
# Smart Cat
# usage smcat <file|file*>

for file in $@; do
    end=${file##*.}
    if [[ $end == 'bz2' ]] ; then
        bzcat $file
    elif [[ $end == 'gz' ]] ; then
        gzcat $file
    else
        cat $file
    fi
done

さまざまな圧縮タイプをすべて処理する方法が組み込まれていないのはばかげているようです。それともありますが、まだ見つけていませんか?みんな助けてくれてありがとう!

4

2 に答える 2

1

おそらく、さまざまな圧縮タイプを処理する方法が組み込まれているわけではありません。圧縮タイプを決定するためにファイル拡張子に依存したくない場合は、fileコマンドを使用できます。

file test.bz2   
test.bz2: bzip2 compressed data, block size = 900k
于 2013-03-08T22:41:43.360 に答える
1

GNU Tar の自動圧縮フラグを使用する

主に tarball を扱っている場合は、GNU tar の auto-compress フラグを使用して問題の一部を解決できます。

 -a, --auto-compress
       use archive suffix to determine the compression program

これは bz2 と gz 拡張機能を処理しますが、より風変わりなものでは失敗する可能性があります。例えば:

tar xvfz "$filename"

somefile.tar.gzsomefile.tar.bz2で同等の機能で動作します。

/usr/bin/file識別のための使用

通常、ファイル ユーティリティは、grep または glob パターンの助けを借りて、正しいファイル タイプを提供します。例えば:

$ file foo*
foo:     ASCII text
foo.bz2: bzip2 compressed data, block size = 900k
foo.gz:  gzip compressed data, was "bar", from Unix, last modified: Fri Mar  8 17:33:48 2013

case ステートメントを使用して、ファイル グロブを反復処理するか、"$@". いずれにせよ、この例は役立つはずです:

for file in foo*; do
    case `file "$file"` in
        *ASCII*) cat   "$file" ;;
         *gzip*) zcat  "$file" ;;
          *bz2*) bzcat "$file" ;;
    esac
done
于 2013-03-08T22:51:24.767 に答える