Скопируйте все файлы и папки, исключая файлы подверсии и папки на OS X

Я пытаюсь скопировать все файлы и папки от одного каталога до другого, но исключить определенные файлы. А именно, я хочу исключить файлы подверсии и папки. Однако я хотел бы общее все же краткое решение.

Я предполагаю, что найду потребность исключить несколько типов файлов в ближайшем будущем. Например, я мог бы хотеть исключить .svn, *.bak, и *.prj.

Вот то, для чего я соединил так, но это не работает на меня. Первая часть, найдите работы, но я делаю что-то не так с xargs и CP. Я попробовал CP и без -R. Кроме того, я использую OS X, и это, кажется, имеет менее известную версию xargs, чем системы Linux.

find ./sourcedirectory -not \( -name .svn -a -prune \)
     | xargs -IFILES cp -R FILES ./destinationdirectory
14
задан 13.02.2010, 09:37

7 ответов

(Отредактированный после перечитывания вопроса. Корреспондент говорит, что 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 имеет дело с запаздывающей наклонной чертой в исходном пути. Это ведет себя по-другому при включении наклонной черты, чем если бы Вы не делаете. Поиск 'запаздывающей наклонной черты')

22
ответ дан 07.12.2019, 11:15

Не генерал решения, но... можно использовать команду экспорта svn для создания копии рабочей области без .svn папок метаданных.

2
ответ дан 07.12.2019, 11:15
%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn  | tar xvf - -C FOLDER_OUT )

если Вы хотите Вас, может даже поместить 'объем плазмы' или что-то подобное, промежуточное 2 процесса tar.

2
ответ дан 07.12.2019, 11:15

Отредактированный ответ: проблема - это -R делает Ваше копирование рекурсивным и таким образом, Вы заканчиваете тем, что копировали скрытые файлы. Вот то, что я использовал бы:

find source/  -mindepth 1 -not \( -name .svn -prune \) | xargs -Iitem cp item target/

-mindepth 1 флаг говорит find проигнорировать каталог верхнего уровня. Так как Вы хотите скопировать все содержание того каталога в новый каталог верхнего уровня, я предполагаю, что Вы не хотите это.

Как Chris Nava говорит в своем ответе, уже существует встроенный способ сделать это, если мы говорим о папках SVN, но так как Вы попросили более общее решение, это может помочь немного.

0
ответ дан 07.12.2019, 11:15

Я пошел бы об этом другим путем, с помощью tar и исключать механизм.

От в целевом каталоге:

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

Этот будет CD к источнику, tar содержание, исключая то, что перечислено в excludefile, и затем untar он к текущему каталогу.

1
ответ дан 07.12.2019, 11:15

Я предполагаю, что это зависит, насколько большой Ваше дерево, но почему не только копируют все сначала, затем обрезают .svn папки после:

find /dest-dir -type d -name .svn -exec rm -rf {} \;

?

0
ответ дан 07.12.2019, 11:15

Не забывайте grep-v

find . | grep -v .svn
0
ответ дан 07.12.2019, 11:15

Теги

Похожие вопросы