Plan 9 from Bell Labs’s /usr/web/sources/contrib/arisawa/cpdir/README

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


#
#	cpdir ver.1.5
#
#	coded by Kenji Arisawa (Kenar)
#	bug report to: arisawa@aichi-u.ac.jp
#	location:
#		http://plan9.aichi-u.ac.jp/netlib/cmd/
#

This program, `cpdir' , is a direcory copy tool for Plan9.

#
#	Usage
#
Usage: cpdir [-vstugRm]  [-l pathlist] srcdir dstdir [path ...]
Options and arguments:
	-v: verbose
	-u: copy owner info
	-g: copy group info
	-s: safe option in case of name confliction,
		then,not remove but just rename.
	-R: remove redundant files and directories in dstdir
	-m: merge
	-t: ignore mtime
	-l pathlist:
		Look "Path list file" section of this document.

	srcdir:
		source dir from which copy is made.
	dstdir:
		destination dir in which copy is made.
	path ... : pathes in source to be processed.
		path and pathlist can not co-exist.

#
# Function:
#
	`cpdir' makes effort to make a copy of file in srcdir
	to dstdir. Those that are copied are:
	- contents
	- modified time
	- permissions
	- group	if possible. (under -g option)
	- owner if possible. (under -u option)

	`cpdir' is complicated program. Because, we have many combinations:
	sources: file	or dir
	destination: file or dir
	modified time comparison with source to destination: < or = or >
	Yes, we have 2*2*6=24 combination.
	And we have variety of options of `cpdir'...

	What happens if there are same path name in source and
	destination ?
	To make clear, let srcpath and dstpath be source path and
	destination path.

	case 1: srcpath is a file and dstpath is also a file
	Let s.mtime and d.mtime be modified time of source
	and destination respectively. Then `cpdir' copies:
	- contents (if s.mtime > d.mtime)
	- modified time (if s.mtime > d.mtime)
	- permissions (if s.mtime >= d.mtime)
	- group	(under -g option, if s.mtime >= d.mtime)
	- owner if possible. (under -u option, if s.mtime >= d.mtime)

	case 2: srcpath is a directory and dstpath is also a
	directory.
	Then `cpdir' goes into deeper level of both directory
	and copying process continues.
	In exiting the direcory,`cpdir' copies:
	- modified time (if s.mtime > d.mtime)
	- permissions (if s.mtime >= d.mtime)
	- group	(under -g option, if s.mtime >= d.mtime)
	- owner if possible. (under -u option, if s.mtime >= d.mtime)

	case 3: srcpath is a file and dstpath is a directory
	If s.mtime > d.mtime then:
	`cpdir' just renames dstpath adding '_' at the beginning
	of basename, and then create a copy of srcpath to dstpath.
	With uid/gid option in path list file, `cpdir'
	copies files with that uid/gid in dstpath.

	case 4: srcpath is a directory and dstpath is a file
	If s.mtime > d.mtime then:
	without any option, `cpdir' removes dstpath and
	then create a copy of srcpath to dstpath;
	with -s option, `cpdir' just renames dstpath
	adding '_' at the beginning of basename, and
	then create a copy of srcpath to dstpath.
	With uid/gid option in path list file, `cpdir'
	copies files with that uid/gid in dstpath.

	With -R option, `cpdir' removes files and directories
	in destination that are non-existent in source.

#
#	Some usage examples
#
example 1:
	make a copy of a directory.
	% cpdir srcdir dstdir
	where srcdir is a path to the source directory
	and dstdir is a path to the destination directory.
	If dstdir is already exist, -m option is required.
	% cpdir -m srcdir dstdir
example 2:
	Let's assume that we, host owner, want to have a copy
	(a mirror) of remote fs in local fs.
	We assume local fs is fossil.
	then:
	confirm remote are mounted on /n, say, /n/remote
	and execute:
	% mntgen
	% echo srv -APW f | con fscons
	% mount /srv/f /n/f
	% cp -x /n/remote/adm/users /n/f/adm/users
	% echo users -r /active/adm/users
	% cpdir -mvugR /n/remote /n/f
	WARNING: R option removes all files that are not in /n/remote.
example 3:
	backup my remote files to local fossil
	confirm both remote fs and local fs are mounted on,
	fore example, /n/remote and /n/f, respectively and then
	execute:
	% cpdir -mvR /n/remote /n/f $home
	WARNING: R option removes all files that are not in /n/remote/$home
	from /n/f/$home.
example 4:
	Synchronize your plan 9 system to outside.plan9.bell-labs.com
	If you administer your plan 9 system keeping
	a natural rule:
		change uid or gid of files that you want
		to be protected in updating.
	then you can use `cpdir' in updating your system.
	I am developing a smart tool to synchronize our system
	to /n/sources/plan9. Now testing in progress ...

#
# Path list file
#
	Each line is trimmed before evaluation.
	Lines that begin with '#' is comment.
	Blank lines are simply discarded.
	Other lines have forms:
		path uid gid
		path uid
		path
	or
		! pattern
		!
	The former denotes the path to be processed,
	while the latter denotes the path pattern that should be rejected.
	uid and gid are optional and they can be `*' which means "any"
	uid and gid protect target to be copied.
	Created files or directories will have these uid and gid.
	A line
		path * *
	is equivalent to
		path
	and a line
		path sys *
	is equivalent to
		path sys
	For example,
	term% ls -l /lib/ndb
	--rw-rw-r-- M 8 sys     staff  581 Dec 12 23:49 /lib/ndb/auth
	--rw-rw-r-- M 8 sys     sys   5285 Jul 31 01:06 /lib/ndb/common
	--rw-rw-r-- M 8 sys     sys     95 Jun  6  2000 /lib/ndb/consoledb
	d-rwxrwxr-x M 8 sys     sys      0 May  9  2002 /lib/ndb/dhcp
	--rw-rw-r-- M 8 sys     sys     61 Sep 15  2002 /lib/ndb/dnsdump
	--rw-rw-r-- M 8 sys     staff 5078 Jan  8 19:47 /lib/ndb/local
	--rw-rw-r-- M 8 sys     sys   2976 Jan 12 01:40 /lib/ndb/local.complicated
	--rw-rw-r-- M 8 sys     staff  241 Sep 13  2002 /lib/ndb/nfs
	then /lib/ndb/auth,/lib/ndb/local,/lib/ndb/nfs
	will not be overwritten under path list description:
		lib	sys sys

	Lines that begin with `!' mean the path that should not be processed.
 	Path pattern follows `!', and the pattern is Rc style globe matching
	except `/' is not special.
	Null pattern, that is, single '!' in a line
		!
	will terminate pattern list. (but not terminate path list.)


#
# sample path list file for -l option:
#
	386	* sys
	cron sys *
	dist sys sys
	rc	sys
	lib sys sys
	sys sys sys
	acme * *
	mail/lib upas upas
	adm/timezone
	! sys/log/*
	! lp/*
	! */tmp/*
	! */_*
	! * *

Don't mined so much, this is merely a sample that shows syntax
Last pattern denote: files that contains space.
Note that tokenize is not supported in pattern.

I hate file names that begin or end with spaces.
And I also hate file names that contain '?' and/or '*'.
cpdir does not handle these file name patterns that follow '!'.

Known bug:

Note:
	Not enough tested

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.