Это очень похоже на (закрытый) вопрос: Bash-скрипт, копирующий файлы без перезаписи . Ответ, который я дал, ссылается на решение «find | cpio
», упомянутое в других ответах (за исключением временных критериев, но в этом разница между «похожим» и «тем же»), а также описывает решение с использованием GNU «tar».
CTime
Когда я тестировал на Solaris, ни GNU tar, ни (Solaris) cpio не смогли сохранить настройку ctime; действительно, я не уверен, что есть способ сделать это. Например, команда touch
может установить atime или mtime или оба, но не ctime. Системный вызов utime()
также принимает только значения mtime или atime; он не обрабатывает ctime. Итак, я считаю, что если вы найдете решение, которое сохраняет время, то это решение, вероятно, будет зависеть от платформы. (Странный пример: взломать дисковое устройство и отредактировать данные в inode - не переносимо, требует повышенных привилегий.) Перечитывая вопрос, я вижу, что «сохранение ctime» не является частью требований (phew); это просто критерий того, скопирован файл или нет.
ChDir
Я думаю, что операции 'cd
' необходимы, но они могут быть полностью локализованы в скрипте или командной строке, хотя, как показано в приведенном ниже вопросе и в командных строках, вторая из которых предполагает GNU tar .
(cd /my; find source/directory -ctime -2 | cpio -pvdm /my/dest/directory)
(cd /my; find source/directory -ctime -2 | tar -cf - -F - ) |
(cd /my/dest/directory; tar -xf -)
Без использования chdir()
(он же cd
) вам потребуются специализированные инструменты или опции для обработки манипуляций с именами путей на лету.
Имена с пробелами, переводы строк и т. Д.
Специфичные для GNU 'find -print0
' и 'xargs -0
' очень мощные и эффективные, как отметил Адам Хос. Как ни странно, GNU cpio
имеет опцию для обработки вывода из 'find -print0
', то есть '--null
' или его краткой формы '-0
'. Итак, используя GNU find
и GNU cpio
, безопасная команда:
(cd /my; find source/directory -ctime -2 -print0 |
cpio -pvdm0 /my/dest/directory)
Примечание : Это не перезаписывает ранее существующие файлы в каталоге резервного копирования. Для этого добавьте -u
к команде cpio
.
Аналогично, GNU tar
поддерживает --null
(очевидно, без краткой формы -0
) и может также использоваться:
(cd /my; find source/directory -ctime -2 -print0 | tar -cf - -F - --null ) |
(cd /my/dest/directory; tar -xf -)
Обработка имен файлов с помощью нулевого терминатора в GNU чрезвычайно умна и является ценным нововведением (хотя я узнал об этом только недавно, благодаря SO; в GNU tar она была не менее десяти лет).