Вызов cp из BASH и использование опции -u

Вызов cp из BASH и использование опции -u

Есть ли способ заставить cpопцию --updateпечатать файлы, которые не были скопированы, поскольку исходный каталог содержал более новую версию файла?

решение1

Заменить .cp -urrsync -urvv

Две буквы «v» здесь не опечатка: они нужны для большей информативности, чтобы показать пропущенные файлы.

Пропущенные файлы будут выглядеть так the_filename is newer, поэтому для получения списка пропущенных файлов можно использовать эту однострочник:

rsync -urvv source/ target | grep ' is newer$' | sed -e 's/ is newer$//'

Или, если вы собираетесь использовать его в интерактивном режиме, --progressфлаг может оказаться очень полезным.

решение2

Я не думаю, что есть способ сделать cpэто напрямую, но это должно сделать по сути то же самое:

cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); print $1 } END { if (NR == 0) print "NOFILES" }' | xargs -I{} find . ! -name {} -maxdepth 1

Этот небольшой однострочный ответ имеет некоторые ограничения:

1) Это зависит от того, нет ли файлов с именем "NOFILES". Вы можете изменить эту строку в awkкоманде, чтобы она соответствовала вашим потребностям.

2) Вы должны находиться в каталоге, где fileсуществует. Если вы не в этом каталоге, вам нужно изменить команду findна be find dirWhereFileExistsвместо find . Если вы не копируете из одного каталога, вы можете использовать find dir1 dir2...вместо этого.

3) Это не сработает, если по какой-то причине в именах файлов есть обратные или одинарные кавычки.

Как вы можете заметить, это не самое надежное решение, но для одноразовой операции оно подойдет.

РЕДАКТИРОВАТЬ

Я проснулся сегодня утром и понял, что вышеприведенное решение — мусор. Если вы попытаетесь скопировать несколько файлов, он будет искать столько раз, сколько у вас файлов, исключая один файл каждый раз. Однако следующее решение должно сработать:

cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); regex = $1 "|" regex } END { if (NR == 0) { regex = "NOFILES|" } print ".*/("substr(regex, 0, length(regex))")" }' | xargs -I{} find . -regextype posix-extended ! -regex {} -maxdepth 1

Он создает регулярное выражение по мере продвижения и передает его findвместо этого. Применяются те же ограничения, что и выше.

Извините за мой пердеж. Видимо, было уже слишком поздно заходить на StackOverflow.

решение3

Подойдет ли rsync для этой работы? У него много опций, которые соответствуют вашему описанию, например, «не перезаписывать новые файлы» и т. д. И вы можете заставить его вести журнал результатов. Я часто использую его для удаленного и локального копирования файлов.

Вы также можете использовать его очень детально.

Удачи.

Связанный контент