How to copy recursively and change file names to be unique

cpfilesosx

I have a large tree containing a lot of photos on an external drive that was formatted with one of the linux filesystem types (don't remember which one). It's mounted on my mac and I'm trying to copy the photos over, but it looks there are files named 'somePic.jpg' and 'somePic.JPG'. When I try to copy them, OSX complains that there are duplicate names and quits. How can I copy them over while ensuring the file names are unique? I can't just rename any dupes on the source tree first because OSX mounted the drive read only.

I played around w/ cp, gcp, sed and xargs for a couple of hours, but was unable to get anything working.

Best Answer

...per your comment on the question...

pax -rws'/\.JPG$/.CAP&/' /root/of/copied/tree /dest/path

If .jpg and .JPG are your only issues, that should just work.

You can also add a print primitive to the filename substitution to get a list of all of those filenames which were changed:

pax -rws'/\.JPG$/.CAP&/p' /root/of/copied/tree /dest/path

As near as I can tell, pax should already be installed on an OSX system, and so this should amount to a pretty stress-free solution overall.

If the problems turn out to be more profound after all, though, it may also be of interest to you that pax supports...

-i

Interactively rename files or archive members. For each archive member matching a pattern operand or each file matching a file operand, pax will prompt to /dev/tty giving the name of the file, its file mode, and its modification time. pax will then read a line from /dev/tty. If this line is blank, the file or archive member is skipped. If this line consists of a single period, the file or archive member is processed with no modification to its name. Otherwise, its name is replaced with the contents of the line. pax will immediately exit with a non-zero exit status if EOF is (CTRL+D) encountered when reading a response or if /dev/tty cannot be opened for reading and writing.

Related Question