誰だ 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