Я пытаюсь скопировать все файлы и папки от одного каталога до другого, но исключить определенные файлы. А именно, я хочу исключить файлы подверсии и папки. Однако я хотел бы общее все же краткое решение.
Я предполагаю, что найду потребность исключить несколько типов файлов в ближайшем будущем. Например, я мог бы хотеть исключить .svn, *.bak, и *.prj.
Вот то, для чего я соединил так, но это не работает на меня. Первая часть, найдите работы, но я делаю что-то не так с xargs и CP. Я попробовал CP и без -R
. Кроме того, я использую OS X, и это, кажется, имеет менее известную версию xargs, чем системы Linux.
find ./sourcedirectory -not \( -name .svn -a -prune \)
| xargs -IFILES cp -R FILES ./destinationdirectory
(Отредактированный после перечитывания вопроса. Корреспондент говорит, что rsync не установлен),
Возможной проблемой с Вашим find/xargs решением являются пробелы в именах файлов. Для обхождения этого скажите, находят и xargs для использования нулевого символа (ASCII 0) для разделения найденных файлов:
find ./sourcedirectory -not ( -name .svn -a -prune ) -print0 | xargs -0 -IFILES cp FILES ./destinationdirectory
Если Вы находите, что 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/
Например:
rsync -avC /path/to/source/directory /path/to/destination/directory
(примечание: Если Вы еще не слишком знакомы с rsync, несомненно, будут читать на той странице справочника о том, как rsync имеет дело с запаздывающей наклонной чертой в исходном пути. Это ведет себя по-другому при включении наклонной черты, чем если бы Вы не делаете. Поиск 'запаздывающей наклонной черты')
Не генерал решения, но... можно использовать команду экспорта svn для создания копии рабочей области без .svn папок метаданных.
Отредактированный ответ: проблема - это -R
делает Ваше копирование рекурсивным и таким образом, Вы заканчиваете тем, что копировали скрытые файлы. Вот то, что я использовал бы:
find source/ -mindepth 1 -not \( -name .svn -prune \) | xargs -Iitem cp item target/
-mindepth 1
флаг говорит find
проигнорировать каталог верхнего уровня. Так как Вы хотите скопировать все содержание того каталога в новый каталог верхнего уровня, я предполагаю, что Вы не хотите это.
Как Chris Nava говорит в своем ответе, уже существует встроенный способ сделать это, если мы говорим о папках SVN, но так как Вы попросили более общее решение, это может помочь немного.
Я пошел бы об этом другим путем, с помощью tar и исключать механизм.
От в целевом каталоге:
tar -X excludefile -C source -f - . | tar xf -
Этот будет CD к источнику, tar содержание, исключая то, что перечислено в excludefile, и затем untar он к текущему каталогу.
Я предполагаю, что это зависит, насколько большой Ваше дерево, но почему не только копируют все сначала, затем обрезают .svn папки после:
find /dest-dir -type d -name .svn -exec rm -rf {} \;
?