复制所有文件和文件夹,不包括 OS X 上的 subversion 文件和文件夹

Mic*_*ott 15 terminal bash command-line find macos

我试图将所有文件和文件夹从一个目录复制到另一个目录,但排除某些文件。具体来说,我想排除 subversion 文件和文件夹。但是,我想要一个通用而简洁的解决方案。

我想在不久的将来我会发现需要排除几种类型的文件。例如,我可能想排除 .svn、*.bak 和 *.prj。

这是我整理的内容,但它对我不起作用。第一部分, find 有效,但我在xargscp 上做错了。我试过cp有和没有-R. 另外,我使用的是 OS X,它的xargs版本似乎比 linux 系统少。

find ./sourcedirectory -not \( -name .svn -a -prune \)
     | xargs -IFILES cp -R FILES ./destinationdirectory
Run Code Online (Sandbox Code Playgroud)

Dou*_*ris 23

(重新阅读问题后编辑。发问者说未安装 rsync)

find/xargs 解决方案的一个可能问题是文件名中的空格。为了解决这个问题,告诉 find 和 xargs 使用空字符(ASCII 0)来分隔找到的文件:

find ./sourcedirectory -not ( -name .svn -a -prune ) -print0 | xargs -0 -IFILES cp FILES ./destinationdirectory
Run Code Online (Sandbox Code Playgroud)

如果您发现 rsync 可用,我仍然认为 rsync 是更好的解决方案:

将 rsync 与 -C 选项一起使用。从rsync 手册页

这是一个有用的速记,用于排除您通常不想在系统之间传输的大量文件。它使用与 CVS 类似的算法来确定是否应忽略文件。

这将告诉 rsync 忽略这些模式:

RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~
#* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj 
*.so *.exe *.Z *.elc *.ln core .svn/ .git/ .bzr/
Run Code Online (Sandbox Code Playgroud)

例如:

rsync -avC /path/to/source/directory /path/to/destination/directory
Run Code Online (Sandbox Code Playgroud)

(注意:如果您还不太熟悉 rsync,请务必阅读该手册页,了解 rsync 如何处理源路径中的尾部斜杠。如果包含斜杠,则其行为与不包含斜杠的情况不同。搜索“尾随斜线”)