Сценарий для распаковки
Из предыдущей темы вылез сценарий, который как ни странно, показался кому-то полезным.
Я занялся и обнаружил ещё пару утилит в репозитории: unp и atool.
Поскольку, по сравнению с первым у меня было кое-что, чего там не было,
а по сравнению со вторым было много больше, я решил его не выбрасывать
а попробовать доделать.
Что хочу:
1. Нормальное определение типа архива.
Как заметил Иван Лох:
"Если на клетке слона написано буйвол... file как-то кошернее и надежнее"
Но есть деталь: если архив составной (tar.gz, например), то вероятно нельзя определить,
что внутри, не зная названия.
Думаю, что file будет основным, а затем должно происходить уточнение по имени файла.
Кто посоветует правильней?
2. Минус всех сценариев - низкая модульность и настраиваемость.
Хочу сделать плагины.
Нужно ли?
3. Наверное, в связи с этим, стоит переписать сценарий на что-то
более вразумительное, чем shell?
4. Очень бы хотелось получить архивы экзотических форматов (типа ACE),
если кто-то может сделать с файликом test.txt внутри
и содержимым "test archive packer".
5. Чтобы ещё полезного добавить?
Это черновой вариант (надеюсь сделать скрипт к следующей неделе):
#
# Unpack archives. Functions by `muhas` modified by Artiom N..
#
# Used tools: unp, atool.
# TODO:
# ppmd
# munpack
# +unzoo
# uudecode
# rzip.
# iso.
# orange.
# pbzip
# pigz
alias x=unpack
# Распаковка любого архива (http://muhas.ru/?p=55)
unpack()
{
if [ $# -lt 1 ]; then
echo "Usage: unpack <file> [args]" >&2
return 1
fi
e_exists()
{
which "$1" 2>&1 > /dev/null
}
a_name="$1"
lower_name="$(echo "$1" | tr A-Z a-z)"
extract_dir="$( echo $(basename "$a_name") | sed "s/\.${1##*.}//g" )"
shift
if [ -r "$a_name" ] ; then
case "$lower_name" in
*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$a_name" $* ;;
*.tar.gz|*.tgz) tar xvzf "$a_name" $* ;;
*.tar.xz) tar --xz -xvf "$a_name" $* ;;
*.tar.zma|*.tlz|*.tlzma) tar --lzma -xvf "$a_name" $* ;;
*.tar.lzop|*.tzo) tar --lzop -xvf "$a_name" $* ;;
*.tar.lzip) tar --lzip -xvf "$a_name" $* ;;
*.bz2|*.mar) bunzip2 "$a_name" $* ;;
*.cab) cabextract -d "$extract_dir" "$a_name" ;;
*.rar) unrar x "$a_name" $* ;;
*.gz) gunzip "$a_name" $* ;;
*.tar) tar xvf "$a_name" $* ;;
*.zip) unzip "$a_name" $* ;;
*.z) uncompress "$a_name" $* ;;
*.7z|*.s7z) 7za x "$a_name" $* ;;
*.rar) unrar x "$a_name" $* ;;
*.xz) unxz "$a_name" $* ;;
*.arj) arj x "$a_name" $* ;;
*.ace|*.lzx) unace x "$a_name" $* ;;
*.lzm|*.lzma) unlzma "$a_name" $* ;;
*.lha) lha xv "$a_name" $* ;;
*.lrz) lrunzip "$a_name" $* ;;
*.lz) if e_exists plzip; then
plzip -d "$a_name" $*
elif e_exists lzip; then
lzip -d "$a_name" $*
fi
;;
*.lzo) lzop -dv "$a_name" $* ;;
*.ha) ha x "$a_name" $* ;;
*.kgb) kgb "$a_name" $* ;;
*.ar) command ar vx "$a_name" $* ;;
*.cpio|*.afio) cpio -idv $* < "$a_name" ;;
*.zpaq) if e_exists zp; then
zp x "$a_name" "$*"
elif e_exists zpaq; then
zpaq x "$a_name" $*
fi ;;
*.iss) innoextract -L -e "$a_name" ;;
*.msi) unshield -D 2 -v -o -L -d "$extract_dir" x "$a_name" ;;
*.exe) echo "innoextract, orange or unshield" ;;
*.zoo) zoo -x "$a_name" $* ;;
*.tnef|*.dat) tnef -v -C "$extract_dir" "$a_name" ;;
*.chm) if e_exists archmage; then
archmage "$a_name" "$extract_dir"
elif e_exists extract_chmlib; then
extract_chmlib "$a_name"
fi
;;
*.shar|shell.*archive) [ ! -e "$extratc_dir" ] && mkdir -p "$extract_dir"
unshar -f -d "$extract_dir" "$a_name"
;;
*.adf) unadf -d "$extract_dir" "$a_name" ;;
*.dms) xdms -v -x "$a_name" ;;
*.jar|*.war|*.apk|*.j) jar -xvf "$a_name" ;; # or zip, unpack200.
*.alz) unalz -d "$extract_dir" "$a_name" ;;
*.arc|*.ark|*.sue) nomarch -v "$a_name" ;;
*.sea|*.sea.bin) macunpack "$a_name" ;;
*.hqx) hexbin -v "$a_name" ;;
*.dmg) 7za x "$a_name" ;; # or dmg2img.
*.deb)
mkdir -p "$extract_dir/control"
mkdir -p "$extract_dir/data"
cd "$extract_dir"
command ar vx "../${a_name}" > /dev/null
cd control; tar xzvf ../control.tar.gz
cd ../data; tar xzvf ../data.tar.gz
cd ..; rm *.tar.gz debian-binary
cd ..
;;
*.rpm) mkdir "$extract_dir"
cd "$extract_dir"
rpm2cpio "../${a_name}"|cpio -idumv $*
cd ..
;;
*) echo "Cannot unpack '$a_name' $*..." ;;
esac
else
echo "'$a_name' is not a valid file"
fi
}
# ... и упаковка (http://muhas.ru/?p=55)
pack()
{
if [ $1 ] ; then
case $1 in
tbz) tar cjvf $2.tar.bz2 $2 ;;
tgz) tar czvf $2.tar.gz $2 ;;
tar) tar cpvf $2.tar $2 ;;
bz2) bzip2 -c --best -v $2 > $2.bz2 ;;
gz) gzip -c -9 --best -n -v $2 > $2.gz ;;
zip) zip -r $2.zip $2 ;;
7z) 7z a $2.7z $2 ;;
rar) rar a $2.rar $2 ;;
*) echo "'$2' Cannot be packed via pack()" ;;
esac
else
echo "'$2' is not a valid file"
fi
}
Reply to: