Psync was written by Dan Kogai. Information on original version (0.68) is here: http://www.dan.co.jp/cases/macosx/psync.html Psync is part of and requires MacOSX:File package. Source code is here (you have to build it): http://search.cpan.org/search?dist=MacOSX-File Note: For version 0.68 and 0.69 Dan forced use of gcc2 which builds an installation that is 2.4 MB. I have used gcc3 which builds installation that is only 520 KB. Instead of make I did: make CC=gcc3 Earlier versions of MacOSX::File I could only build with gcc 3.1 (not with 2.95 and not with 3.3). Note2: "make install" will (incorrectly) install man pages into /man instead of /usr/local/share/man, after installation move them into the right place, or before build add the following to the end of WriteMakefile in main Makefile.PL: INSTALLSITEMAN1DIR => "/usr/local/share/man/man1", INSTALLSITEMAN3DIR => "/usr/local/share/man/man3", If you prefer ready/prebuilt/binary package: - for Panther just download and install this: - for Jaguar: download and install this: , then download , and put in /usr/local/bin If you use PsyncX , please note that it installs psync in /usr/bin (instead of /usr/local/bin). After installing copy or link psync from /usr/local/bin to /usr/bin. My version is based on original version 0.65 and contains the following changes: (you can find all my changes by searching for "###js") in version 0.65.5: Fixed bugs: 1. If a file in source was replaced by a folder the script barfed and did not backup that folder 2. If a folder in source was replaced by a file the script produced an error and did not remove old folder nor backup the file that replaced it. 3. If a folder was removed in source and corresponding folder in destination contained any of the IgnoreFiles (.DS_Store is almost always there), the ignore file was not deleted, folder was not empty and could not be deleted either. After a while there were a lot of empty folders in the destination. 4. If a file to be deleted in destination was a link with no target, it would not be deleted (-e $dfile condition would fail). Any enclosing folders would not be deleted either. 5. Dead links could not be deleted or replaced with folders 6. Locked files in destination could not be deleted (when removed from source) nor replaced (when changed in source). Fully implemented -a option (it was already used but only in one place). It is a full preview of what would happen if the backup was performed, but without doing anything - -n option only lists total number of files that would be deleted or copied, but it does not say which files. Prettified number of files to delete/copy/ignore (removed empty lines) Added to $IgnorePat (so it is skipped): .*/Library/Caches/.* .*/Library/Safari/Icons/.* .*/System/Library/Extensions.kextcache .*/private/var/db/NetworkInterfaces.xml .*/private/var/vm/swapfile* .*/private/var/db/BootCache.playlist .*/private/var/db/volinfo.database .*/private/var/db/SystemConfiguration/com.apple.PowerManagement.xml in version 0.65.16: 1. Force -v when -a is set 2. Changed all items in "Ignore Pattern" so they don't start with / to allow it to work with non-boot volumes. It is now: .*.*/tmp/.*,.*/dev/.*,.*/private/tmp/.*,.*/private/var/tmp/.*,.*/private/var/vm/.*,/ .*/private/var/run/.*\.pid,.*/Temporary\ Items/.*,.*/Library/Caches/.*,.*/Library/Safari/Icons/.* 3. Removed .DS_Store from "Ignored Files" because I didn't like that after restoring all my folders forget their view settings. 4. Exit if any source does not exists 5. Better error message when destination is not a directory 6. Added empty (root) element to count of unchanged (so the numbers add up) 7. Count of unchanged only shows when -v > 1 (less useful info) 8. Does not delete/copy/fix if count = 0 9. Added a subroutine to delete trees in destination (to deal with folders in $IgnorePat ) 10. To replace a link with a file, we now delete it first 11. When there is an error while copying, we now show a message instead of the error code 12. When link has changed: if the contents are different and -v > 3 we now show old and new link values 13. Improved checking for change in modification date to deal with fact that SMB shares use 2 second resolution on mod time (so instead of checking if mod times are the same, we check if they differ by more than 1 second) 14. When counting files we now do not show . (dots) when -v > 2 (interferes with other output) 15. New option -p = do not fix directory attributes (permissions). Useful when source is on a volume that does not support permissions or has a completely different idea of them (like Windows/SMB) 16. When -n option was specified, items to be deleted were listed even though other things were not. Now it is more consistent: -n gives just the summary, -a gives full listing - both without doing anything (-n takes precedence) 17. Don't count/delete non-existent $IgnoreFiles 18. In the first line of counts a dot was missing Note on Panther symlinks attributes: In older versions of BSD (and in OS X 10.2 and earlier) symbolic links did not have their own attributes (ownership and permissions) - they inherited attributes of objects they pointed to. In FreeBSD 5.1 (on which Panther is based in large part) symbolic links have their own attributes. However, Apple, while porting FreeBSD to Darwin, allowed symlinks to have its own attributes, but disabled all code that allowed to manipulate those attributes - the system calls that implement it (lchmod, lchown and lutimes) are commented out in source code (you can see for yourself: ). They did not remove it from documentation - so man pages for chmod, chown, chgrp and touch describe the new -h option that allows to modify symlink attributes, but it does not work. I am sure that they had a very good reason to do that :). in version 0.65.17: 1. After changing from/to daylight savings time, there was 1 hour difference in modification time of some files on SMB/Windows shares - these files are incorrectly marked as modified and copied. in version 0.65.18: 1. Fixed copying (updating) locked files (thanks to Miles Kurland for reporting this bug). version 0.67.1 = version 0.65.18 Dan Kogai has updated MacOS::File package to version 0.67. However, he did not include any of my changes to psync. The psync file in MacOSX::File 0.67 did not change except for version number, so my changes still apply. in version 0.67.2: 1. Added checking for changes in attributes (owner, group and permissions). New option -m will inhibit this checking, if you want old behavior (e.g. for speed). Requested by Derrick Bass. 2. Included a patch from Richard Morse: "... support multiple "exclude" strings. It doesn't allow regexs, but allows as many fixed strings as you want. I added this so I could exclude cache files of other browsers, etc. easily." The syntax is: psync --exclude=pattern source destination e.g. psync --exclude=Cache ~/Library/Mozilla /Volumes/backup/Mozilla in version 0.68.1: 1. Updated man page and usage text (when psync is invoked w/o parameters) 2. Rebuilt with Dan's version 0.68, but built with gcc3 (instead of gcc2) to reduce size in version 0.68.2: 1. Changed selection of ignored paths (comparison to $IgnorePat) to use full path instead of file name 2. Changed $IgnorePat (list of patterns for selecting ignored paths) to ignore only root level "dev" folders (/dev and /Volumes/xxx/dev). Some people call their development folders "dev" - these folders were not backup up. (reported by Jeff Holland of DejaVu fame) version 0.69.1 = version 0.68.2 1. Dan Kogai has updated MacOS::File package to version 0.69. However, he did not include any of my changes to psync. The psync file in his package did not change, so my changes still apply. 2. Rebuilt with Dan's version 0.69, but built with gcc3 (instead of gcc2) to reduce size version 0.69.2 1. Fixed symlinks not updating correctly. version 0.69.3 1. Fixed symlinks not updating correctly under MacOS 10.3.7