
Есть ли способ заставить cp
опцию --update
печатать файлы, которые не были скопированы, поскольку исходный каталог содержал более новую версию файла?
решение1
Заменить .cp -ur
rsync -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 для этой работы? У него много опций, которые соответствуют вашему описанию, например, «не перезаписывать новые файлы» и т. д. И вы можете заставить его вести журнал результатов. Я часто использую его для удаленного и локального копирования файлов.
Вы также можете использовать его очень детально.
Удачи.