Я хочу скопировать все файлы "pom.xml" из большого дерева в новое дерево: на каждом уровне дерева src у меня есть этот файл. Я хочу получить ту же древовидную структуру, но игнорировать пустые каталоги.

звучит как rsync, но я не понимаю ...:-/

заранее спасибо ...

2 ответа2

2

Вы можете сделать это, например,

rsync -rvm --include='*/' --filter='-! pom.xml' SOURCE DEST
  • -r рекурсы,
  • -v печатает многословно, что происходит,
  • -m удаляет пустые каталоги (каталоги, которые ничего не содержат после передачи),
  • --include='*/' говорит rsync явно включать сами каталоги, которые в противном случае будут удалены следующим фильтром (это предостережение, которое я застрял в постыдном количестве раз: что каталоги явно необходимо разрешить в подобных случаях)
  • --filter='-! pom.xml' файлы , которые не (это то, !msgstr "соответствует) шаблону (включая все каталоги без шаблона --include выше).

Как я уже сказал, я несколько раз ломал голову над поведением каталогов в сложных правилах фильтрации для rsync, и, возможно, это ясно из руководства, но в этом случае я смог пропустить его в течение длительного времени, поэтому разъяснение будет оценено.

0

Из корневой папки дерева:

find . -name pom.xml | rsync -ax --files-from=- . /destination/tree/

rsync не может выполнить «исключить все, кроме», поэтому сначала мы находим файлы, а затем подаем их в список files-from стандартного ввода (-). -a означает архив, как и рекурсия и сохранение разрешений. -x означает "не проходить через файловые системы", которые я склонен включать по привычке, и удалять его, когда я уверен, что хочу пройти через файловые системы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .