cp --parents option on mac

MacosCommand LineCommand Line-Arguments

Macos Problem Overview


On Linux, I have a --parents option available for the cp command so I can do

cp --parents test/withintest/go.rb test2

http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html

On Mac, I do not have this option available. Is there a way to do this on Mac? Why is this option not available?

PS. The purpose of --parents is the following:

> ‘--parents’ Form the name of each destination file by appending to the > target directory a slash and the specified name of the source file.

> The last argument given to cp must be the name of an existing > directory.

> For example, the command:

> cp --parents a/b/c existing_dir

> copies the file a/b/c to existing_dir/a/b/c, creating any missing intermediate directories.

Macos Solutions


Solution 1 - Macos

This bothered me quite a lot as well. A workaround for this could be to use rsync.

rsync -R test/withintest/go.rb test2

has the same effect as cp --parents and OS X comes standard with rsync.

Solution 2 - Macos

You can use the ditto command on Mac OS X:

The basic form

ditto <src-path> <dst-path>

does what you want. There's a lot more options too - check out the man page.

Solution 3 - Macos

You can install the GNU version of cp using MacPorts.

After MacPorts is installed you can install the coreutils packages:

sudo port install coreutils

Then you will be able to use the GNU version cp and other core utilitites (ls, date, cat, etc.) by prefixing the command with a g:

gcp --parents test/withintest/go.rb test2

If you want these GNU versions to be used by default you can add the GNU bin update your path. Add the following to your ~/.bash_profile:

export PATH="/opt/local/libexec/gnubin:$PATH"

Solution 4 - Macos

The Homebrew way:

Install coreutils

brew install coreutils

Use the GNU g- prefixed command

gcp --parents test/withintest/go.rb test2

Solution 5 - Macos

I used rsync and what I did was:

rsync -R dir/**/file.json destination

Solution 6 - Macos

Try

mkdir -p `dirname "$file_path"` && cp "$old_dir/$file_path" "$file_path"

This first creates the directory with all itermediates in the relative file path. Then it copies the file to the newly created directory.

Solution 7 - Macos

I would not replace mac cp with GNU cp. I would also not used ditto because it is not cross-platform. Instead use cross-platform tools, such as rsync:

rsync <srcDir/srcFile> <dst>

Result: dst/srcDir/srcFile

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondmonopolyView Question on Stackoverflow
Solution 1 - MacosStephanView Answer on Stackoverflow
Solution 2 - MacosEchelonView Answer on Stackoverflow
Solution 3 - MacosKaraView Answer on Stackoverflow
Solution 4 - MacosMartin PeterView Answer on Stackoverflow
Solution 5 - MacoslucasdeassisView Answer on Stackoverflow
Solution 6 - MacosSpearAndShieldView Answer on Stackoverflow
Solution 7 - MacosvikranttView Answer on Stackoverflow