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

Измените формулу от, скажем, =A1/A2 кому: =A1/$A$2 прежде, чем скопировать его, так, чтобы знаменатель не изменялся.

2
17.04.2012, 17:45
3 ответа

Замена cp -ur с rsync -urvv.

Два "v"-s нет опечатки: они там для увеличенного многословия, для показа файлов, которые были пропущены.

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

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

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

5
27.01.2020, 21:55
  • 1
    Это намного лучше, чем мое отправленное решение. +1 для запоминания rsync. –  Tim Pote 22.04.2012, 17:24

Я не думаю, что существует способ иметь 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 команда, чтобы быть 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

Это создает regex, когда это идет и передачи это к find вместо этого. Те же ограничения как выше применяются.

Извините за заскок ранее. Угадайте, что было слишком поздно, чтобы быть на StackOverflow.

1
27.01.2020, 21:55

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

Можно стать очень детализированными с ним также.

Удачи.

0
27.01.2020, 21:55

Теги

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