Запустив ubuntu 12.04, я хочу сравнить 2 директории, скажем folder1 / и folder2 /, и скопировать любые файлы, отличные от folder3 /. Есть также вложенные файлы, поэтому соответствующие подкаталоги также должны быть скопированы
Есть ли одна команда, которая поможет мне? Я могу получить полный список запущенных измененных файлов:
rsync -rcnC --out-format="%f" folder1/ folder2/
Но у rsync, похоже, нет возможности «экспортировать» эти файлы в другой целевой каталог. Могу ли я передать список в cp или какую-нибудь другую программу, чтобы файлы копировались, а каталоги тоже создавались? Например, я пытался
rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/
но это также не сохранит каталоги, просто скопирует все файлы в folder3 /
diff -qr
иawk
для составления списка, тогдаrsync
...rsync --include-from=FILE
опцию.Ответы:
Используйте --compare-dest.
Со страницы руководства:
сначала проверьте ваш синтаксис с помощью --dry-run
Затем, когда вы удовлетворены результатом:
эта ссылка имеет хорошее объяснение области действия --compare-dest.
источник
rsync -rcC --compare-dest=folder2/ folder1/ folder3/
rsync version 3.1.1 protocol version 31
в своем локальном и rsync не понимает~/
пути для--compare-dest
param.--compare-dest
необходим абсолютный путь.fonts/Makefile.in
файл, который идентичен как по каталогу, такfolder2
и поfolder1
каталогу.Этот маленький скрипт должен работать:
Но я также думаю, что анализ вывода diff -qr был бы лучшим решением, потому что он дает вам путь и имя для каждого файла последовательно.
РЕДАКТИРОВАТЬ
Это будет одна команда, ваша команда слегка изменена. Но это создаст
folder1
подfolder3
. И он не работает с полными путями, но и скрипт выше не работает с полными путями.Я использовал
\"
в ,rsync
чтобы заставить его работать с файлами и каталогами , содержащие пробелы. Проверено на Ubuntu 10.04. Надеюсь, это поможет.источник
Это самая простая форма, которую я мог бы придумать, если вы готовы сначала спуститься в нее,
folder1
прежде чем вводить команду.Это более медленный вариант, но я считаю, что он соответствует вашим требованиям и может быть выполнен с использованием не относительных имен каталогов:
Я оставил вашу исходную
rsync
команду в покое, потому что вы сказали, что она дает правильный список файлов (и мои тестовые файлы, очевидно, отличаются от ваших, поэтому я не мог с уверенностью сказать, что получу правильный список файлов, если я испортил с этим).Для
grep
удаления имен каталогов из выводаrsync
.Выход
grep
затем поступает на другой сrsync
помощьюxargs
. В параметреfolder1/./{}
extra./
используется для указания rsync на создание относительных каталогов, начиная с./{}
игнорированияfolder1/
. Другими словами, это избегает созданияfolder3/folder1/
.Я смог проверить это только на CentOS 6.4, но AFAIK должен работать так же, как в Ubuntu 12.04.
EDIT: Я хотел бы отметить , что смитовский ответ «s, несомненно , лучше, но я хотел , чтобы принять удар на это делать с оригинальной
rsync
командой в такте , так как она дает вам желаемый результат.источник