Pregunta

I'm trying to clone a directory which holds a git repo.

i.e., I have /Users/me/someFolder - someFolder has ALOT of files, like over 250k. It's also a git repo, with a .git directory, and many other hidden files.

Additionally it contains a number of other sub-directories (folders).

So, to clone this, preserving all permissions, copying recursively, and including ALL files/directories in ZSH on Big Sur, do I simply do:

cp -a /Users/me/someFolder /Users/me/otherFolder?

I ask as I've seen other syntax such as:

cp -a /Users/me/someFolder/. /Users/me/otherFolder? (note the .).

Thanks,

¿Fue útil?

Solución

The second method also works if otherFolder already exists. Other than that, there is no difference (assuming that /Users/me/someFolder is an existing folder). In more detail:

cp -a /Users/me/someFolder /Users/me/otherFolder

If someFolder is a folder (i.e. a directory — and not a symbolic link to a directory) and otherFolder already exists (and is a directory or a symbolic link to one), this copies /Users/me/someFolder/some/file to /Users/me/otherFolder/someFolder/some/file. If someFolder is a directory but otherFolder doesn't exist, this copies /Users/me/someFolder/some/file to /Users/me/otherFolder/some/file.

If someFolder exists but is not a directory (it's a regular file, a symbolic link, etc.), it is copied to either /Users/me/otherFolder/someFolder if otherFolder is an existing directory or a symbolic link to one, or to /Users/me/someFolder otherwise (regular file, other special file, or non-existent).

cp -a /Users/me/someFolder/. /Users/me/otherFolder

If someFolder is a directory or a symbolic link to one, this always copies /Users/me/someFolder/some/file to /Users/me/otherFolder/some/file, regardless of whether otherFolder existed or not. (Except if otherFolder is an existing file that isn't a symbolic link or a file, in which case the command will fail.)

In all cases, if the thing to copy is a directory, all of its contents are copied recursively, preserving permissions and modification times. (Access times are also preserved, but they're updated in the source.) That comes from the -a option.

An equivalent command is

rsync -a /Users/me/someFolder/ /Users/me/otherFolder

Note the trailing / on the source so that /Users/me/someFolder/some/file is copied to /Users/me/otherFolder/some/file. If the source was /Users/me/someFolder, it would be copied to /Users/me/otherFolder/someFolder.

rsync is equivalent to cp -R in simple cases, but it's cleverer about not copying files that are already present in the destination folder, so it's good for resuming an interrupted copy or for doing incremental backups. Rsync also has a lot of options to do things like select which files to copy.

Otros consejos

The first option will create something like /Users/me/otherFolder/someFolder, while the second option will leave /Users/me/otherFolder with the contents of someFolder, but not with otherFolder as a subfolder.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a apple.stackexchange
scroll top