Я написал быстрый скрипт для рекурсивной проверки каждого файла в каталоге и последующего сжатия только наиболее сжимаемых файлов. Он захватывает пару мегабайт внутри файла и проверяет их с помощью gzip --fast
, а затем использует xz
для сжатия файла, если это необходимо.
Вы можете запустить его с :./compress.if.compressible dir _name
cores=$(grep '^core id' /proc/cpuinfo | sort -u | wc -l)
IFS=$'\n'
for file in $(find "$1" -type f); do
#Skip small files. The savings is minimal and sometimes xz just makes these larger.
size_b=`du --apparent-size -b "$file" | sed 's/\t.*//'`
if [[ $size_b -le 1024 ]]; then
echo -e "\nSkipping small file $file"
continue
fi
size=`du --apparent-size --block-size=1M "$file" | sed 's/\t.*//'`
reduction=$(dd if="$file" bs=1M count=2 skip=$(expr $size / 3) 2>/dev/null | gzip --fast -v 2>&1 > /dev/null)
echo -e "\n$reduction $file"
if [[ $(echo $reduction | sed 's/\..*//') -ge 20 ]]; then
echo "$size_b *.9 > 90" | bc
xz -v -T $cores "$file"
new_size=`du --apparent-size -b "$file.xz" | sed 's/\t.*//'`
if [[ `echo "$new_size * 100 / $size_b" | bc` -ge 90 ]]; then
echo "Insufficent Compression. Reverting..."
unxz "$file.xz"
fi
fi
done