复制 OS X 上除 Subversion 文件和文件夹之外的所有文件和文件夹

复制 OS X 上除 Subversion 文件和文件夹之外的所有文件和文件夹

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

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

这是我整理的,但对我来说不起作用。第一部分,find 有效,但我做错了参数cp。 我试过cp带和不带-R。另外,我使用的是 OS X,它似乎有一个功能较少的版本参数比Linux系统。

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

答案1

(重新阅读问题后进行了编辑。提问者说 rsync 未安装)

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

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

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

使用带有 -C 选项的 rsync。从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/

例如:

rsync -avC /path/to/source/directory /path/to/destination/directory

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

答案2

这不是一个通用的解决方案,但是...您可以使用 svn export 命令来创建不包含 .svn 元数据文件夹的工作区副本。

答案3

%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn  | tar xvf - -C FOLDER_OUT )

如果您愿意,您甚至可以在两个 tar 进程之间放置“pv”或类似的东西。

答案4

我会用不同的方式来解决这个问题,使用 tar 及其排除机制。

从目标目录中:

tar -X excludefile -C source -f - . | tar xf -

这将 cd 到源目录,打包内容,排除 excludefile 中列出的内容,然后将其解压到当前目录。

相关内容