Я пытаюсь скопировать все файлы и папки из одного каталога в другой, но исключаю определенные файлы. В частности, я хочу исключить файлы и папки Subversion. Тем не менее, я хотел бы общее, но краткое решение.
Я предполагаю, что найду необходимость исключить несколько типов файлов в ближайшем будущем. Например, я могу захотеть исключить .svn, * .bak и * .prj.
Вот то, что я собрал так для, но это не работает для меня. Первая часть, найди работы, но я делаю что-то не так с xargs и cp . Я попробовал cp с и без -R
. Кроме того, я использую OS X, и у нее, похоже, менее функциональная версия xargs, чем в системах Linux.
find ./sourcedirectory -not \( -name .svn -a -prune \)
| xargs -IFILES cp -R FILES ./destinationdirectory
find
команда правильно использует-prune
исключение элементов .svn, вы передаете-R
флаг,cp
которому эта команда сообщает рекурсивную. Когда это происходит, вы теряете все детали, которые были у вас вfind
команде. Я собираюсь повозиться с этим на минуту, но я думаю, что ответ не использовать-R
вcp
команде.-R
флаг, я уверен. Удалите это, и у вас все будет хорошо (хотя вы можете добавить,-mindepth 1
чтобы игнорировать папку каталога верхнего уровня, которую вы не хотите копировать, я полагаю)Ответы:
(Отредактировано после перечитывания вопроса. Спрашивающий говорит, что rsync не установлен)
Возможная проблема с вашим решением find / xargs - пробелы в именах файлов. Чтобы обойти это, скажите find и xargs использовать нулевой символ (ASCII 0) для разделения найденных файлов:
Если вы обнаружите, что rsync доступен, я все же думаю, что rsync - гораздо лучшее решение:
Используйте rsync с опцией -C. Со страницы руководства rsync :
Это скажет rsync игнорировать эти шаблоны:
Например:
(примечание: если вы еще не слишком знакомы с rsync, обязательно прочитайте на этой странице руководства о том, как rsync справляется с завершающей косой чертой в исходном пути. Если вы включите косую черту, она будет вести себя иначе, чем если бы вы этого не делали. Поиск "косая черта")
источник
-R
флаг вxargs
части команды.Не общие решения, но ... вы можете использовать команду svn export для создания копии рабочей области без папок метаданных .svn.
источник
если вы хотите, вы можете даже поместить 'pv' или что-то подобное между процессами 2 tar.
источник
Грязный, но быстрый и лаконичный способ:
Это копирует один каталог в другой (таким образом, рекурсивный вариант
-r
), а затем рекурсивно стирает все с именем.svn
(игнорируя регистр).источник
Я бы пошел по-другому, используя tar и механизм исключения.
От в каталоге назначения:
Это перейдет к исходному тексту, сохранит содержимое, исключая то, что указано в excludefile, и затем распакует его в текущий каталог.
источник
Отредактированный ответ : проблема в том, что
-R
копирование становится рекурсивным, и в итоге вы копируете скрытые файлы. Вот что я бы использовал:-mindepth 1
Флаг указываетfind
игнорировать каталог верхнего уровня. Поскольку вы хотите скопировать все содержимое этого каталога в новый каталог верхнего уровня, я предполагаю, что вы этого не хотите.Как говорит Крис Нава в своем ответе , уже есть встроенный способ сделать это, если мы говорим о папках SVN, но, поскольку вы попросили более общее решение, это может немного помочь.
источник
xargs
не сломан, но в Unix-подобных системах по умолчанию не используются имена файлов (или имена каталогов) с пробелами в них. Если у вас есть пробелы или «забавные» символы в именах файлов (или именах каталогов), вам придется проделать дополнительную работу, чтобы справиться с этим. (В GNUfind
, есть целый раздел вman
странице под названием «НЕОБЫЧНОЕ FILENAMES» из - за этот вопрос) . В-0
флагеxargs
и-print0
дляfind
помощи справиться с этими проблемами. Я обещаю вам, однако, что вы не хотите использовать-R
в своей команде копирования. Он отменит все, что вы делаете, чтобы избежать каталогов SVN.Я полагаю, это зависит от того, насколько велико ваше дерево, но почему бы просто не скопировать все сначала, а затем обрезать папки .svn после:
?
источник
find
командование может занять немного больше человеческого времени , но вы делаете это только один раз. Вы можете использовать команду сотни раз, как только вы ее правильно поняли.find
себя лучше, чтобы мне не пришлось это делать. Но вы правы: в этом решении нет ничего плохого.Не забудьте grep -v
источник
Вы также можете сделать наоборот. Скопируйте все, затем удалите папки .svn, используя следующую команду:
источник