Skip to content
/ walk Public

Enter and edit archives like they're directories

License

Notifications You must be signed in to change notification settings

mle86/walk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

walk(1) - enter and manipulate archive files like directories

Build Status GPLv3 License

Version 2.3.0, January 2020

walk [-cyAq] [--] ARCHIVE

Description

walk is a shell tool which allows you to treat archive files as directories. It completely unpacks an archive file into a temporary directory named to match the archive filename. It then spawns a new shell inside the new temporary directory, where you may proceed with any command line stuff you wish to do. After leaving this shell, walk asks you if you wish to re-pack the archive with the contents of the temporary directory (which you may have changed). This way, you can interactively edit an existing archive, examine its content, add files to it and whatever else you wish to do with its contents.

If walk is invoked on a non-existing filename or a non-file name without the -c option, it will print an error and exit. With the -c option, walk will accept non-existing filenames and create a new, empty archive with that name. This can be used to create new archives from scratch.

Installation

This is just a shell script, it does not need any compilation.

# make install

This will copy the script to /usr/local/bin/walk and the man page to /usr/local/share/man/man.1/walk.1.gz.

Supported File Types

walk uses the file(1) tool to determine the archive file type. Currently, it supports handling these file types:

  • tar
  • tar, compressed with gzip/bzip2/xz (requires tar with built-in support for these compression formats, i.e. the -zjJ options)
  • 7-zip (requires 7z/7za/7zr binary)
  • zip, jar (requires zip and unzip binaries)
  • rar (requires rar binary)
  • cpio (requires the GNU cpio binary)
  • deb, ar (requires the GNU binutils ar binary)

If the -c option has been used to create a new empty archive, the file tool cannot be used internally as there is no prior archive file to analyze. In this case the type is guessed from the filename extension instead. These extensions are recognized:

.tar, .tar.gz, .tgz, .tar.bz, .tbz, tar.bz2, .tbz2, .tar.xz, .txz, .7z, .zip, .jar, .rar, .deb, .cpio, .a

Options

  • -c
    Create non-existing ARCHIVEs instead of exiting with an error.
  • -y
    Assume `yes' for the two questions walk asks after leaving the subshell. This means the original archive will always be recreated, and the temporary archive directory will always be removed afterwards.
  • -A
    Store the working directory root (.) in the archive, not just its contents. Not all archivers support this (tar and cpio do).
    Unpacking archives which contain the . directory entry can cause the current directory's owner and/or mode to be changed by the archiver program, so use this option with caution.
  • -q
    Quiet mode; suppresses most archiver output such as filenames that are being extracted/compressed.

Notes

Beware that some archive types have their own idiosyncracies concerning file ownership:

  • tar, zip, and cpio archives can store file owner informations. When walk is run as non-root, the owner informations are silently discarded.
  • a archives (ar(1)) can store owner informations, but will always discard them on unpacking.
  • 7z and rar archives don't store owner informations.

Example

mle@box:~$ walk test.tgz
 walk: unpacking archive
 ./httpd.conf
 ./rawdata
 ./uname
 ./subdir/
 ./subdir/a1
 ./subdir/a2
 ./subdir/a3
 walk: starting new shell
mle@box:~/test.tgz$ 
mle@box:~/test.tgz$ ls -la
 drwxr-xr-x  3 mle users 4,0K 2010-09-28 02:44 .
 drwx------ 24 mle users 4,0K 2010-09-28 02:53 ..
 -rw-r-----  1 mle users  30K 2010-09-28 02:42 httpd.conf
 -rw-r--r--  1 mle users 437K 2010-09-28 02:41 rawdata
 drwxr-xr-x  2 mle users 4,0K 2010-09-28 02:45 subdir
 -rwxr-xr-x  1 mle users  14K 2010-09-28 02:44 uname
mle@box:~/test.tgz$ ls -l subdir/
 -rw-r--r-- 1 mle users 300 2010-09-28 02:45 a1
 -rw-r--r-- 1 mle users 400 2010-09-28 02:45 a2
 -rw-r--r-- 1 mle users 500 2010-09-28 02:45 a3
mle@box:~/test.tgz$ rm subdir/a2
mle@box:~/test.tgz$ echo foo > bar
mle@box:~/test.tgz$ >rawdata
mle@box:~/test.tgz$ 
mle@box:~/test.tgz$ exit
 walk: shell terminated.
 walk: Recreate archive test.tgz ? [Y/n]  y
 walk: recreating archive
 ./httpd.conf
 ./bar
 ./rawdata
 ./uname
 ./subdir/
 ./subdir/a1
 ./subdir/a3
 walk: Delete temporary directory? [Y/n]  y
 walk: deleting temp dir
mle@box:~$ 
mle@box:~$ ls -l test*
 -rw-r--r-- 1 mle users 19K 2010-09-28 02:56 test.tgz
mle@box:~$ tar tzvf test.tgz
 -rw-r----- mle/users     30398 2010-09-28 02:42:48 ./httpd.conf
 -rw-r--r-- mle/users         4 2010-09-28 02:55:12 ./bar
 -rw-r--r-- mle/users         0 2010-09-28 02:55:24 ./rawdata
 -rwxr-xr-x mle/users     13900 2010-09-28 02:44:45 ./uname
 drwxr-xr-x mle/users         0 2010-09-28 02:54:50 ./subdir/
 -rw-r--r-- mle/users       300 2010-09-28 02:45:28 ./subdir/a1
 -rw-r--r-- mle/users       500 2010-09-28 02:45:35 ./subdir/a3

License

GNU GPL v3

Author

Maximilian Eul <maximilian@eul.cc> (http://github.com/mle86/walk)