123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #! /bin/sh
- #
- # u7z - 7zip file archive Virtual File System for Midnight Commander ( ftp://ftp.ibiblio.org/pub/Linux/utils/file/managers/mc/ )
- #
- # Copyright (C) 2004 Sergiy Niskorodov (sgh at ukrpost dot net)
- # Written by Sergiy Niskorodov aka SGh
- #
- # beta version 4.16 (11 Apr 2005)
- #
- # 7z for linux can be found on http://sourceforge.net/projects/p7zip/
- # Thanks to urar VFS authors andrey joukov 2:5020/337.13@fidonet.org,
- # christian.gennerat@alcatel.fr, Andrew V. Samoilov <sav@bcs.zp.ua>
- # I use this script like example
- # This program 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.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- SEVENZ=`which 7za`
- mc7zfs_list ()
- {
- $SEVENZ l "$1" 2> /dev/null | gawk -v uid=${UID-0} '
- BEGIN { flag=0; arr_of_month="JanFebMarAprMayJunJulAugSepOctNovDec" }
- /^-------/ { flag++; if (flag > 1) exit 0; next }
- {
- if (flag == 0) next
- year=substr($1, 1, 4)
- month=substr($1, 6, 2)
- day=substr($1, 9, 2)
- month_name=substr(arr_of_month, (month-1)*3+1, 3)
- time=substr($2, 1, 5)
- if (index($3, "D") != 0)
- attr="drwxr-xr-x"
- else
- if (index($3, ".") != 0)
- attr="-rw-r--r--"
- size=$4
- $0=substr($0, 54)
- if (NF > 1)
- name=$0
- else
- name=$1
- gsub(/\\/, "/", name)
- printf "%s 1 %-8d %-8d %8d %3s %2d %4d %s %s\n", attr, uid, 0, size, month_name, day, year, time, name
- }'
- }
- mc7zfs_copyin ()
- {
- # preserve pwd.
- pwd=`pwd`
- # Create a directory and copy in it the tmp file with the random name
- dir="$3".dir
- mkdir "$dir"
- cd "$dir"
- mv "$1" .
- arname=`basename "$1"`
- di="${2%/*}"
- # if file is to be written upper in the archive tree, make fake dir
- if test "$di" != "${2##*/}" ; then
- # echo asdsad 1>&2
- mkdir -p "$di"
- fi
- # pwd > /tmp/cdir
- # echo "$arname $2" > /tmp/ters
- cp -fp "$3" "$dir/$2"
- # cp -f "$1" "$3.dir"
- $SEVENZ a "$arname" "$2" -w >/dev/null 2> /dev/null
- mv "$arname" "$1"
- cd $pwd
- rm -rf "$3.dir"
- }
- mc7zfs_copyout ()
- {
- dir=tmpdir.${RANDOM}
- mkdir /tmp/"$dir"
- # echo "$1 $2 $3" > hers
- # p7zip 0.91 don't understand filename in subdir without "./"
- # but in top dir it understand only without "./"
- FLIST=`$SEVENZ l "$1" 2> /dev/null`
- echo "$FLIST" | grep -q "[.][/]" &> /dev/null && EXFNAME=*./"$2" || EXFNAME="$2"
- EXFN=`basename "$2"`
- $SEVENZ e -r- "$1" "$EXFNAME" -o/tmp/"$dir" > /dev/null 2> /dev/null
- cat /tmp/"$dir"/"$EXFN" > "$3"
- rm -rf /tmp/"$dir"
- }
- mc7zfs_mkdir ()
- {
- # Function not fully implemented, because 7z cannot keep empty directories
- # preserve pwd.
- pwd=`pwd`
- # Create a directory and create in it a tmp directory with the good name
- dir=tmpdir.${RANDOM}
- mkdir $dir
- cd $dir
- mv "$1" .
- arname=`basename "$1"`
- mkdir -p "$2"
- # 7z cannot create an empty directory
- # touch "$2"/.emptydir
- $SEVENZ a -r "$arname" "$2" >/dev/null 2>/dev/null
- # echo "$1" "$2" >error34
- # $SEVENZ d ../"$1" "$2/.7zfs" >/dev/null
- mv "$arname" "$1"
- cd $pwd
- rm -rf $dir
- }
- mc7zfs_rm ()
- {
- $SEVENZ l "$1" 2> /dev/null | grep -q "[.][/]" &> /dev/null && EXFNAME=*./"$2" || EXFNAME="$2"
- $SEVENZ d "$1" "$EXFNAME" 2>&1 | grep -q E_NOTIMPL &> /dev/null && { echo -e "Function not implemented...\n7z cannot delete files from solid archive." >&2 ; exit 1 ; }
- }
- umask 077
- cmd="$1"
- shift
- case "$cmd" in
- list) mc7zfs_list "$@" ;;
- rm) mc7zfs_rm "$@" ;;
- rmdir) mc7zfs_rm "$@" ;;
- mkdir) mc7zfs_mkdir "$@" ;;
- copyin) mc7zfs_copyin "$@" ;;
- copyout) mc7zfs_copyout "$@" ;;
- *) exit 1 ;;
- esac
- exit 0
|