The Mac OS X Finder (file manager) annoyingly doesn't merge a source directory into a pre-existant target directory but replaces the latter with the former. The following script helps out, though not very well. And now I would like to have my ones and zeroes back. #!/usr/local/bin/scsh \ -e main -s USAGE movedirfiles FROM-DIR TO-DIR SYNOPSIS: Moves visible (not dotted) files from FROM-DIR into TO-DIR, preserving relative paths --provided they don't clash with a namesake. This isn't carefully wrought comfort code. It's digidirt good enough for my purpose. In particular, it relies on the nonstandard "mv -n" option of the OS X / BSD variant of "mv". (Edited after use.) !# ;; simplify and remove trailing "/." (forgetting about symlinks) (define (simplerify-file-name fn) (let ((sn (simplify-file-name fn))) (cond ((string-suffix? "/." sn) (string-drop-right sn 2)) ((string= sn ".") "") (else sn)))) (define (file-name-sans-directory path) (last (split-file-name path))) (define (file-name-dotted? fname) (and (not (file-name-directory? fname)) (string-any #\. (file-name-sans-directory fname)) (string-null? (file-name-extension fname)))) ;; Return quasirelative paths of subdirectories, each dir before its subdirs (define (find-directories dirname) (with-cwd dirname (run/strings (find "." -type d)))) (define (find-visible-files dirname) (remove! (lambda (fname) (file-name-dotted? fname)) (run/strings (find ,dirname -type f)))) (define (copy-directory-skeleton orig-dir clone-dir) (for-each (lambda (path0) (let ((path1 (path-list->file-name (list path0) clone-dir))) (if (file-not-exists? path1) (create-directory (simplerify-file-name path1))))) (find-directories orig-dir))) ;; ... but don't overwrite an existing file ("mv -n", a nonstandard switch) ;; (RENAME-FILE wouldn't move files onto another device.) (define (move-file from-fname to-filordirname) (format #t "(-> \"~a\" \"~a\")~%" from-fname to-filordirname) (run (mv -n ,from-fname ,to-filordirname))) (define (move-directory-files from-dir to-dir) (copy-directory-skeleton from-dir to-dir) (for-each (lambda (fname) (move-file (path-list->file-name (list fname) from-dir) (path-list->file-name (list fname) to-dir))) (with-cwd from-dir (find-visible-files ".")))) (define (main args) (let ((from-dir (second args)) (to-dir (third args))) (move-directory-files from-dir to-dir)))