Как я могу сделать “копию, если изменено” операция?

Страница Wikipedia "Нетбук" перечисляет несколько основанные на ARM - и основанные на MIPS нетбуки.

  • "HP Compaq Airlife 100... за 230€" является, по-видимому, "приводимым в действие ARM нетбуком Android HP" двассылки( )
  • Нетбук ARM продает за 80$
  • "Гонконгский производитель поставляет основанный на Linux ультрамини-ПК (UMPC) ноутбук только за 250$... На основе "промышленного стандарта" основанная на RISC архитектура (возможно MIPS?) микросхема по сообщениям выполняет Windows CE, а также Linux". (ссылка)

Вы могли бы также посмотреть на смартфоны и КПК, которые запускают Linux; практически все они используют центральные процессоры ARM, и некоторая версия Linux была портирована многим из них.

  • Linux КПК
  • Pandora за 330$
  • 175$ iKit
  • Пси-частица
  • ... где-нибудь в Интернете я видел "пользовательский ноутбук", созданный из КПК, запускающего Linux, полноразмерную клавиатуру КПК, и стержень и несколько других вещей позволить ему свернуться и развернуться как полноразмерный ноутбук. Для ввода текста и захвата через текст, это работало в течение многих дней между, перезаряжает. Экран был большим маленьким, все же.... Мне бы хотелось найти ссылку на него...

34
23.05.2017, 15:39
6 ответов

rsync является, вероятно, лучшим инструментом для этого. Существует много опций на этой команде так страница справочника чтения. Я думаю, что Вы хотите - опция контрольной суммы или - игнорировать-времена

29
27.01.2020, 19:36
  • 1
    я должен был отметить, что уже попробовал это без успеха. Обе из тех опций только влияют, делает ли rsync копию - но, даже когда он не делает копии, это ни один обновления время изменения конечного файла к тому же как источник (если -t опция указана) или ко времени синхронизации (если -t не указан). –  Brooks Moses 24.01.2012, 07:52
  • 2
    @Brooks Moses: Это не делает. По крайней мере, моя версия rsync не делает. Если я делаю это: mkdir src dest; echo a>src/a; rsync -c src/* dest; sleep 5; touch src/a; rsync -c src/* dest, затем stat dest/a показывает его mtime, и ctime равняются 5 secs более старый, чем те src/a. –  angus 24.01.2012, 10:48
  • 3
    @angus: Ха. Хорошо, Вы правы. Ключ, кажется, --checksum опция, и хотя linux.die.net/man/1/rsync не содержит абсолютно ничего, что подразумевало бы, что она имеет любое влияние на том, обновляется ли дата модификации, она, тем не менее, заставляет целевую дату модификации быть оставленной нетронутой. (С другой стороны, --ignore-times опция не имеет этого эффекта; с ним все еще обновляется дата модификации.), Учитывая, что это, кажется, совершенно не документировано, тем не менее, я могу полагаться на него? –  Brooks Moses 24.01.2012, 11:32
  • 4
    @BrooksMoses: Я думаю, что можно полагаться на него: rsyncрабочий процесс: 1) проверьте, должен ли файл быть обновлен; 2) если так, обновите файл. --checksum опция говорит, что не должна быть обновлена, таким образом, rsync не должен продолжаться к шагу 2). –  enzotib 24.01.2012, 12:25
  • 5
    @BrooksMoses: --ignore-times без --checksum скопировал бы каждый файл, и таким образом, также обновляют метку времени, даже если файлы идентичны. –  enzotib 24.01.2012, 23:22

При использовании rsync --checksum хороший общий способ "скопировать, если изменено", в Вашем особом случае существует еще лучшее решение!

Если Вы не хотите излишне перекомпилировать файлы, необходимо использовать кэш, который был создан для точно этой цели! На самом деле, мало того, что это избежит ненужный, перекомпилировал Ваших автоматически сгенерированных файлов, это также ускорит вещи каждый раз, когда Вы делаете make clean и перекомпилируйте с нуля.

Затем я уверен, что Вы спросите, "Действительно ли это безопасно?" Ну, Да, как веб-сайт указывает:

Действительно ли это безопасно?

Да. Самый важный аспект кэша компилятора состоит в том, чтобы всегда производить точно тот же вывод, который произвел бы реальный компилятор. Это включает обеспечение точно тех же объектных файлов и точно тех же предупреждений компилятора, которые были бы произведены, если Вы используете реальный компилятор. Единственным путем необходимо смочь сказать об использовании кэша, скорость.

И это просто в использовании это, просто добавив его как префикс в CC= строка Вашего make-файла (или можно использовать символьные ссылки, но make-файл путь, вероятно, лучше).

7
27.01.2020, 19:36
  • 1
    я первоначально неправильно понял и думал, что Вы предлагали, чтобы я использовал кэш, чтобы внести свой вклад генерации, но теперь я понимаю - Ваше предложение было то, что я просто копирую все файлы и затем использую кэш в процессе сборки, таким образом, избегая восстановления тех, которые не изменились. Это - хорошая идея, но это не преуспеет в моем случае - у меня есть сотни файлов, обычно только изменитесь один или два за один раз, и работаю под Cygwin, просто начинание сотен процессов кэша для рассмотрения каждого файла заняло бы несколько минут. Тем не менее, upvoted, потому что это - хороший ответ для большинства людей! –  Brooks Moses 31.01.2012, 08:14
  • 2
    Нет, я не предлагал, чтобы Вы скопировали все файлы, скорее можно просто автоматически сгенерировать.c оперативные файлы (удалите шаг копии и запись им непосредственно). И затем просто используйте кэш. Я не знаю то, что Вы подразумеваете под стартовыми сотнями процессов кэша... это - просто легкая обертка вокруг gcc, который довольно быстр и ускорит восстановление других частей Вашего проекта, также. Вы попытались использовать его? Я хотел бы видеть сравнение синхронизации между использованием Вашего метода копии по сравнению с кэшем. Вы могли, на самом деле, объединить эти два метода для извлечения пользы из обоих. –  aculich 31.01.2012, 18:07
  • 3
    Право, хорошо, я понимаю теперь о копировании. Разъясниться, что я имею в виду, - это: Если я генерирую файлы на месте, я должен затем звонить ccache file.c -o file.o или эквивалент, несколько сотен времен, потому что существует несколько сотен file.c файлы. Когда я делал это с cmp, вместо ccache, потребовалось несколько минут - и cmp так же легко как ccache. Проблема состоит в том, что, на Cygwin, запуская процесс занимает время, даже для абсолютно тривиального процесса. –  Brooks Moses 01.02.2012, 05:57
  • 4
    Как точка данных, for f in src/*; do /bin/true.exe; done занимает 30 секунд, так да. Так или иначе я предпочитаю своего редактора на базе Windows, и кроме этого вида синхронизации проблемы, Cygwin работает вполне хорошо с моим рабочим процессом как легкое место для тестирования вещей локально, если я не загружаю на серверы сборки. Полезно иметь мою оболочку и моего редактора в той же ОС. :) –  Brooks Moses 01.02.2012, 06:43
  • 5
    Если Вы хотите использовать своего редактора на базе Windows, можно ли сделать это довольно легко с Совместно используемыми папками, если Вы устанавливаете Гостевые Дополнения..., но эй, если Cygwin подходит Вам, то, кого я должен сказать несколько отличающийся? Это просто кажется позором для перехода через странные обручи как это..., и компиляция в целом была бы быстрее в VM, также. –  aculich 01.02.2012, 06:55

Мне нравится использовать унисон в пользу rsync потому что это поддерживает несколько ведущих устройств, имение уже устанавливает мои ssh ключи и vpn отдельно.

Таким образом в моем crontab только одного хоста я позволяю им синхронизироваться каждые 15 минут:

*/15 * * * * [-z "$ (pidof унисон)"] && (унисон тайм-аута 25 м-sortbysize-ui текст - пакет - времена/home/master ssh://192.168.1.12//дом/ведущее устройство - соединяют dev каналом - файл журнала /tmp/sync.master.dev.log), и> /tmp/sync.master.dev.log

Затем я могу разрабатывать с обеих сторон, и изменения распространят. На самом деле для важных проектов у меня есть до 4 серверов, зеркально отражающих то же дерево (3 выполненных унисона от крона, указывая на тот, который не делает). На самом деле Linux и смешанные хосты Cygwin - кроме не ожидают смысла из гибких ссылок в win32 вне cygwin среды.

Если Вы идете этим путем, сделайте начальное зеркало на пустой стороне без -batch, т.е.

unison -ui text  -times /home/master ssh://192.168.1.12//home/master -path dev

Конечно, существует конфигурация для игнорирования файлов резервных копий, архивов, и т.д.:

 ~/.unison/default.prf :
# Unison preferences file
ignore = Name {,.}*{.sh~}
ignore = Name {,.}*{.rb~}
ignore = Name {,.}*{.bak}
ignore = Name {,.}*{.tmp}
ignore = Name {,.}*{.txt~}
ignore = Name {,.}*{.pl~}
ignore = Name {.unison.}*
ignore = Name {,.}*{.zip}

    # Use this command for displaying diffs
    diff = diff -y -W 79 --suppress-common-lines

    ignore = Name *~
    ignore = Name .*~
    ignore = Path */pilot/backup/Archive_*
    ignore = Name *.o
3
27.01.2020, 19:36
  • 1
    , я посмотрел на это, но я не мог найти a unison опция, которая означает, "не обновляет file-last-modified даты". Есть ли один? Иначе это - большое решение совершенно другой проблемы. –  Brooks Moses 02.02.2012, 22:46
  • 2
    -times делает это для меня. Унисон имеет режим пробного прогона также, меня думает. –  Marcos 03.02.2012, 00:29
  • 3
    Ну, установка times=false (или кончающий -times) сделал бы это. Я не знаю, как я пропустил это в документации прежде.Спасибо! –  Brooks Moses 03.02.2012, 01:56
  • 4
    Glad для помощи. Я - сторонник когда дело доходит до сохранения вещей как modtimes, полномочия и гибкие ссылки. Часто пропускаемый –  Marcos 03.02.2012, 18:44

Это должно сделать то, в чем Вы нуждаетесь

diff -qr ./x ./y | awk '{print $2}' | xargs -n1 -J% cp % ./y/

Где:

  • x является Вашей обновленной/новой папкой
  • y является местом назначения, в которое Вы хотите скопировать
  • awk возьмет второй аргумент каждой строки от различной команды (возможно, Вам будет нужен некоторый дополнительный материал для имен файлов с пространством - не может попробовать его теперь),
  • xargs-J % вставит имя файла в CP в надлежащем месте
3
27.01.2020, 19:36
  • 1
    1, потому что это чрезмерно сложно, непортативно (-J bsd-конкретно; с GNU xargs это -I), и не работает правильно, если тот же набор файлов уже не существует в обоих местах (если я touch x/boo затем grep дает мне Only in ./x: boo который вызывает ошибки в конвейере). Используйте инструмент, созданный для задания, как rsync --checksum. –  aculich 31.01.2012, 01:24
  • 2
    Или еще лучше, для этого конкретного случая используют кэш. –  aculich 31.01.2012, 02:06
  • 3
    +1, потому что это - ряд известных команд, которые я могу повредить для использования на подобных задачах (прибыл сюда для того, чтобы сделать разность), все еще rsync может быть лучше для этой конкретной задачи –  ntg 20.11.2017, 10:22

Вы можете использовать переключатель -u в cp следующим образом:

$ cp -u [source] [destination]

Со страницы справочника:

   -u, --update
       copy only when the SOURCE file is newer than the destination file or 
       when the destination file is missing
15
27.01.2020, 19:36

Хотя rsync --checksum является правильным ответом, обратите внимание, что этот вариант несовместим с --times, и что --архив включает --times, так что если вы хотите rsync -a --checksum, вам действительно нужно rsync -a --no-times --checksum.

1
27.01.2020, 19:36

Теги

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