我试图将所有文件和文件夹从一个目录复制到另一个目录,但排除某些文件。具体来说,我想排除 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 中列出的内容,然后将其解压到当前目录。