LoginSignup
4
4

More than 5 years have passed since last update.

再帰的にtar.gzを展開する

Last updated at Posted at 2015-10-10

誰だ tar.gz の中に tar.gz を格納した奴。

#!/bin/sh

set -eu

isTarGz() {
    # tar.gz 形式のファイルパスだけを透過するフィルタ
    if [ ! -p /dev/stdin ]; then
        echo -n ''
        return 0
    fi

    cat - | while read line; do
        if [ -f $line ]; then
            if [[ $line =~ tar.gz$ ]]; then
                echo $line
            fi
        fi
    done
    return 0
}
isNotTarGz() {
    # tar.gz 形式のファイルパスだけを透過しないフィルタ
    if [ ! -p /dev/stdin ]; then
        echo -n ''
        return 0
    fi

    cat - | while read line; do
        if [ -f $line ]; then
            if [[ $line =~ tar.gz$ ]]; then
                :
            else
                echo $line
            fi
        else
            echo $line
        fi
    done
    return 0
}
isNotDirectory() {
    # ディレクトリパスだけを透過しないフィルタ
    if [ ! -p /dev/stdin ]; then
        echo -n ''
        return 0
    fi

    cat - | while read line; do
        if [ ! -d $line ]; then
            echo $line
        fi
    done
    return 0
}
cleanUp() {
    # 一時ファイルを削除する
    rm $items $targz $buffer
}

items=$(mktemp)
targz=$(mktemp)
buffer=$(mktemp)

trap 'cleanUp; exit 1' 1 2 3 15

tar xvzf $1 > $buffer
cat $buffer | isTarGz > $targz
cat $buffer | isNotTarGz > $items
echo -n '' > $buffer

while [ -s $targz ]; do
    cat $targz | while read line; do
        dir=$(dirname $line)
        tar xvzf $line -C $dir | xargs -I@ echo $dir/@ >> $buffer

        # tar.gz から出てきた tar.gz は削除する
        rm $line
    done
    cat $buffer | isTarGz > $targz
    cat $buffer | isNotTarGz >> $items
    echo -n '' > $buffer
done

# 結果を標準出力に流す
cat $items | sort -u | isNotDirectory

cleanUp
4
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4