NAME
nrm, urm - recoverably remove and restore files
SYNOPSIS
nrm [-dfhirRsv] [-t ] [--gracetime ] [--directory]
[--force] [--interactive] [--recursive] [--sequenced] [--help]
[--version] [--verbose] name...
urm [ -f ] name ...
DESCRIPTION
Nrm is a local replacement for rm(1). Nrm removes each specified
file. By default, it does not remove directories.
Files of name dirpath/basename are recursively moved to
dirpath/.gone/basename rendering them normally invisible except by ls
-a. Such files are also implicitly marked for future deletion by
updating their access time.
Nrm lets you use the -- option to indicate that all following
arguments are non-options. To remove a file called `-f' in the
current directory, you could type either
nrm -- -f
or
nrm ./-f
OPTIONS
-d, --directory -r, -R, --recursive
Remove the contents of directories recursively. If a designated
file is a directory, an error comment is printed unless the
optional argument -r has been used. In that case, nrm renames
the directory, making it invisible and subject to future
deletion.
-f, --force
Ignore nonexistent files and never prompt the user. No error
messages are printed when the -f option is given or if the
standard input is not a terminal.
-i, --interactive
Prompt whether to rename each file and, under -r , whether to
rename each directory. If the response does not begin with `y'
or `Y', the file is skipped. Answering 'q' or 'Q' will abort the
program.
-s, --sequenced
If the -s (sequenced backup) option is given, nrm will not
overwrite saved entries in the .gone directory, but instead will
save each file with a unique suffix such that every deleted file
is preserved for the full gracetime number of days.
On long-filename systems, the suffix is of the form: "-YEAR-
MONTH-DAY-HOUR:MIN:SEC", where each named field is 2 characters
long: eg., "foo-93-05-09-21:32:17". If two files of the same
name are deleted within the same second (thereby potentially
mapping to the same name), the conflict is avoided by adding a
random string to the conflicting name. The disambiguating string
is of the form: "%xx" where "x" is randomly chosen from the set
"[0-9A-Za-z]". Eg., "foo-93-05-09-21:32:17%fQ".
On short-filename systems (limited to filenames of 14
characters), the name of the deleted file is constructed by
truncating the original name to 11 characters, and appending a
random suffix of the form "%xx", as described above. Deleting
the file "ThisIsALongFilename", with -s sequencing, could create
the deleted file "ThisIsALong%8c".
-t , --gracetime
Files are kept a default of 3 days before permanent deletion. If
the [-t ] option is given then the file will not be
permanently deleted for at least gracetime days, unless the file
is accessed during that time. Reading an nrm'd file will update
its access time, thereby resetting its scheduled deletion date to
be the default number of days (3) in the future.
-v, --verbose
Print the name of each file before removing it. Unlike GNU rm,
the component files of a directory are not printed.
--help
Print a usage message on standard output and exit successfully.
--version
Print version information on standard output then exit
successfully.
Urm is used to restore deleted files or directories. Given
dirpath/basename or dirpath/.gone/basename as an argument urm will
search for dirpath/.gone/basename and restore the file or directory if
found. The second form allows the user to give a command of the form
urm foo/bar/.gone/* and have the shell do wild-card expansion. The
modification time of restored files is preserved.
Urm will ask before overwriting an existing file unless the -f option
is in effect.
Alternatively, the files in .gone may be viewed with ls(1) and the
desired file can be restored with mv(1) simply by moving it from the
.gone directory to the desired location. When using the (-s) option
for sequenced backups, manually recovery is advisable so that the
desired sequenced version can be chosen.
FEATURES
Nrm is a compiled program and does not use system(2) or exec(2) so is
significantly faster than similiar script-based implementations.
When updating system executable files, using nrm to remove the old
file will prevent causing a "killed on text modification" swap error.
The removed version will be permanently deleted gracetime days after
the last process has ceased to swap to the removed file.
This renaming strategy was used to give a good summary when using
du(1) to evaluate freed-up disk space.
The -d and --directory options are implemented as synonyms for the -r,
-R and --recursive options to provide script-level compatibility with
GNU rm(1).
ADMINISTRATION
A line like the following should be added to root's crontab:
30 1 * * * /etc/nrm.cleanup
The nrm.cleanup script permanently removes all empty directories and
expired files.
SEE ALSO
rm(1) unlink(2).
DIAGNOSTICS
Generally self-explanatory. An attempt was made to provide the same
exit codes and user interface as rm. Returns 0 if successful, 2 on
errors. It is forbidden to remove the file .. , the file . and the
files .gone/* . The -t option does not work on symbolic links.
AUTHOR
Rick Walker (walker@omnisterra.com)
Rick Walker