PDA

View Full Version : unp ابزاری مناسب برای باز کردن انواع بسته ها در لینوکس



white fox
پنج شنبه 20 فروردین 1383, 15:23 عصر
unp ابزاری مناسب برای باز کردن انواع مختلف بسته ها میباشد.unp میتواند فایلهای tar,gzip,bzip2,ar,RPM,rar را باز کند.این ابزار هنگام باز کردن فایل ها سعی میکند فایل ها را در مسیر معین شده قرار دهد(مثلا برای بسته های RPM) اما اگر مسیری برای فایل ها تعیین نشده باشد فایل های درون بسته را در همان دایرکتوری که فایل را باز میکنید قرار میدهد.
مزیت این ابزار این است که لازم به حفظ کردن دستور های مختلف برای باز کردن فایل ها با بسته بندی های مختلف نداریم.
فکر میکنم این ابزار با توزیع های مختلف لینوکس عرضه شده باشد اما اگر این ابزار را در لینوکس خود نداشتید من سورس برنامه رو پایین میگذارم که به زبان perl نوشته شده است. برای استفاده از این ابزارمتن سورس را در یک محیط ویرایش متن کپی کنید سپس با دستور:


chmod +x [file name]

برای حالت اجرایی آماده کنید. آنگاه فایل رو به یکی از مسیرهای PATH سیستم خود کپی کنید(مثلا /usr/bin )
خوشبختانه این ابزار بخشهای option زیادی ندارد...برای بسته هایی که در بالا ذکر شد از دستور زیر استفاده کنید.


unp [program name]

اما برای باز کردن بسته های debian باید از دستور زیر استفاده کنید:


unp -u [program name]

این ابزار ابتدا از فایل برنامه یک فایل با نام data.tar.gzip درست میکند که فایل های درون یرنامه را در این بسته قرار میدهد. که میتوانید از آن استفاده کنید.


#! /usr/bin/perl
# unp, Version 0.0.2
# -----------------------------------------------------------------------
# Originaly written by André Karwath, 1997
# andre.karwath@informatik.tu-chemnitz.de
# http://www.aka-online.de
#
# Modified by Eduard Bloch <eduard@bloch.com>, 2000
# http://www.eduard.bloch.com/edecosi/
#
# "unp" runs the correct unpack program depending on the file extension
# of the given parameter.
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# -----------------------------------------------------------------------
# If you make changes to this script, please feel free to forward the new
# version to eduard@bloch.com or Andre.Karwath@informatik.tu-chemnitz.de
# -----------------------------------------------------------------------
# You need some archiver and compressor programs for extracting:
# GNU tar, gzip, bzip2, ar, rpm, unrar or rar, unarj, unzip and lha

$not_found=": not found\n";
$not_read=": not readable\n";
$unsup=": unsupported format\n";
$usage="
usage: unp file [file]...
file: compressed file(s) to expand

Use -- to pass arguments to external programs, eg. some tar options:
unp fastgl.tgz xmnt.tgz -- -C /tmp

Special option:
-u extract data.tar.gz after each operation (for .deb-packages),
then extract control.tar.gz in control/<filename>/

currently supported extensions and formats are
tar, gz, Z, tar.gz/tgz, tar.bz2, bz2, ar/deb, RPM, shar, rar, arj, zip and LHa
";
$tryfile=" - unknown extension, checking with \"file\"\n";
$testbz2=" contains bzip2-compressed data, determining data type...\n";
$testgz=" contains gzip-compressed data, determining data type...\n";
$skip=" exists allready, skipping...\n";
$is_dir=" is a directory, skipping...\n";

# localisation part (only german at the moment):
if($ENV{'LANG'}=~ "^de"){
$not_found=" wurde nicht gefunden!\n";
$not_read=" konnte nicht gelesen werden!\n";
$unsup=": dieses Format wird nicht unterstützt!\n";
$usage="
Aufruf: unp Datei [Datei] ...
Datei: eine oder mehrere komprimierte Datei(en) zum entpacken

Optionen:
-u Nach jeder Operation data.tar.gz entpacken (z.B. für .deb-Pakete),
sowie control.tar.gz nach control/<Achiv-Name>/

Optionen nach -- werden an externe Programme übergeben, z.B. tar-Optionen:
unp fastgl.tgz xmnt.tgz -- -C /tmp

Derzeit unterstützte Erweiterungen und Formate:
tar, gz, Z, tar.gz/tgz, tar.bz2, bz2, ar/deb, RPM, shar, rar, arj, zip und LHa
";
$tryfile=" - Endung unbekannt, überprüfe mit \"file\"...
";
$testbz2=" enthält bzip2-komprimierte Daten, überprüfe den Datentyp...\n";
$testgz=" enthält gzip-komprimierte Daten, überprüfe den Datentyp...\n";
$skip=" existiert bereits, überspringe...\n";
$is_dir=" ist ein Verzeichnis\n";
}

&print_usage if ($#ARGV<0);

arglabel: foreach $arg (@ARGV){
if("$arg" eq "-u"){$dataunp=1 ; next arglabel};
if("$arg" eq "--"){$argvalue=1; next arglabel};
if($argvalue){
$ARGS="$ARGS $arg";
}else{
push(@FILES,$arg);
}
}

LOOP: foreach $file (@FILES) {
if (!-e $file) {
print $file.$not_found;
next LOOP;
}

if (!-r $file) {
print $file.$not_read;
next LOOP;
}

if (-d $file) {
print $file.$is_dir;
next LOOP;
}
undef $command;

# not just gunzip, create new file with uncompressed data in the current
# directory, same for bz2
if ($file =~ /([^\/]*)\.(gz|Z)$/i) {if (-f $1){ print $1.$skip; next LOOP;}; $command="gunzip < \"$file\" > $1"; }
if ($file =~ /([^\/]*)\.(bz2$)/i) {if (-f $1){ print $1.$skip; next LOOP;}; $command="bunzip2 < \"$file\" > $1"; }

# check also for _tar, because of broken filenames
if ($file =~ /(\.|_)tar$/i) { $command="tar -xvf \"$file\" $ARGS"; }
if ($file =~ /(\.|_)rpm$/i) { $command="rpm2cpio < \"$file\" | cpio -i -d --verbose $ARGS";}
if ($file =~ /(\.|_)tar\.gz$/i) { $command="tar -xvzf \"$file\" $ARGS"; }
if ($file =~ /(\.|_)tar\.bz2$/i) { $command="bunzip2 -c \"$file\" | tar -xvf - $ARGS"; }

if ($file =~ /\.tgz$/i) { $command="tar -xvzf \"$file\" $ARGS"; }
if ($file =~ /\.rar$/i) { $command="rar x \"$file\" $ARGS || unrar x \"$file\" $ARGS"; }
if ($file =~ /\.(ar|deb)$/i) { $command="ar xv \"$file\" $ARGS"; }
if ($file =~ /\.l(ha|zh)$/i) { $command="lha x $ARGS \"$file\""; }
if ($file =~ /\.arj$/i) { $command="unarj x \"$file\""; }
if ($file =~ /\.zip$/i) { $command="unzip \"$file\" $ARGS"; }

# assume that exe is just an arcive with executable header and try
# some programs
if ($file =~ /\.exe$/i) { $command="unzip \"$file\" || unrar x \"$file\" || rar x \"$file\" || unarj x \"$file\" || lha x \"$file\"";}

if ($command eq "") {
print $file.$tryfile;
$filestr=`file \"$file\"`;
if ($filestr =~ /(gzip)/gi){
print $file.$testgz;
$file=~/([^\/]*)$/i; $target="$1.unp";
if (-f $target){ print $target.$skip; next LOOP;}
$command=(`zcat \"$file\" | file -`=~/tar/i) ? "zcat \"$file\" | tar -xvf - $ARGS" : "zcat < \"$file\" > $target";
};

if ($filestr =~ /(bzip2)/gi){
print $file.$testbz2;
$file=~/([^\/]*)$/i; $target="$1.unp";
if (-f $target){ print $target.$skip; next LOOP;}
$command=(`bzcat \"$file\" | file -`=~/tar/i) ? "bzcat \"$file\" | tar -xvf - $ARGS" : "bzcat < \"$file\" > $target";
};

if ($filestr =~ /RAR.*archive/i) { $command="rar x $ARGS \"$file\" || unrar x $ARGS \"$file\""; }
if ($filestr =~ /tar.*archive/i) { $command="tar -xvf \"$file\" $ARGS"; }
if ($filestr =~ /(Debian binary package|\ ar.*archive)/i) { $command="ar xv \"$file\" $ARGS"; }
if ($filestr =~ /LHa.*archive/i) { $command="lha x $ARGS \"$file\""; }
if ($filestr =~ /ARJ.*archive/i) { $command="unarj x \"$file\""; }
if ($filestr =~ /Zip.*archive/i) { $command="unzip \"$file\" $ARGS "; }
if ($filestr =~ /shell.*archive/i) { $command="unshar $ARGS \"$file\""; }
if ($filestr =~ /RPM/) { $command="rpm2cpio < \"$file\" | cpio -i -d --verbose $ARGS";}
# RAR can also create executables
if ($filestr =~ /executable/i){$command="unrar x \"$file\" || rar x $file";}

# if still nothing could be found, print an error message
if ($command eq "") {
print $file.$unsup;
next LOOP;
}
}

system ($command);
if ($dataunp){
$file =~ /([^\/]*)\.deb$/i;
system ("tar zxvf data.tar.gz; mkdir -p control/$1; cd control/$1; tar zxvf ../../control.tar.gz");
}
}

die "\n";

# -----------------------------------------------------------------------------
sub print_usage {
print $usage;
die "\n";
}
# -----------------------------------------------------------------------------

hosseinzadeh
پنج شنبه 20 فروردین 1383, 23:10 عصر
متشکر از مطالب خوب شما ،