Папки Rsync, имена которых начинаются с одинарного и/или двойного -дефиса

  1. Регулярное выражение проверено — сложное утверждение, так как существуют не только базовые и расширенные регулярные выражения, но и ряд нестандартных -разновидностей, некоторые из которых вы используете.

  2. Вы используете расширенные регулярные выражения, вам нужно сообщить об этом вашему sedс опцией-E

  3. Вы ищете разрывы строк (возврат каретки, перевод строки )в своем шаблоне, но sedобрабатывает ввод построчно, поэтому это никогда не совпадет, если вы не соедините строки. Однако,похоже, вы используете GNU sed, поэтому у вас есть опция -zдля обработки всех строк одновременно. Это работает для примера, но может не работать с большими файлами.

  4. В зависимости от вашей оболочки вам может потребоваться использовать одинарные кавычки вместо двойных для защиты скрипта.

    sed -zEi '/,[\r\n]+ ОГРАНИЧЕНИЕ [a-zA-Z0-9_]+ВНЕШНИЙ КЛЮЧ([a-zA-Z0-9_]+)ССЫЛКИ[a-zA-Z0-9_]+([a-zA-Z0-9_]+)/ s// /g' все _файлы _test.sql

уже выполняет замену, которую вы ожидаете в zsh, возможно, также и в вашем cmd.exe. Все-таки адрес строки — это ерунда со всеми строками в одном буфере, так что

sed -zEi 's/,[\r\n]+  CONSTRAINT `[a-zA-Z0-9_]+` FOREIGN KEY \(`[a-zA-Z0-9_]+`\) REFERENCES `[a-zA-Z0-9_]+` \(`[a-zA-Z0-9_]+`\)/ /g' all_files_test.sql

более логичен (результат остается тем же ). Наконец, вы не объясняете, как вы ожидаете, что строки KEY `holdingисчезнут.

Но теперь к стандартному способу выполнения многострочной -подстановки, шаблону N;P;D, который также должен работать для больших файлов:

sed -Ei 'N;/,*[\r\n]+  CONSTRAINT `[a-zA-Z0-9_]+` FOREIGN KEY \(`[a-zA-Z0-9_]+`\) REFERENCES `[a-zA-Z0-9_]+` \(`[a-zA-Z0-9_]+`\)/{s// /g;s/^/\n/;D;};P;D' all_files_test.sql

Nвсегда добавляет следующую строку, поэтому ваш шаблон может совпадать. Pпечатает первую строку буфера, а Dудаляет эту первую строку и начинает с остальных. Таким образом, с N;P;Dу вас всегда есть пара строк в пространстве шаблонов.

Однако, если мы заменили, у нас есть только одна строка, но мы хотим продолжить со следующей, поэтому хитрость заключается в том, чтобы вставить пустую строку в начало шаблона только сs/^/\n/(GNU sed! ), чтобы быть удаленным D.

2
29.11.2021, 09:42
2 ответа

Добавьте префикс ./к относительному пути (имени файла ), и он больше не будет начинаться с дефиса

rsync -av./-items* destination:destPath/

Или удалите подстановочный знак *и перенесите родительский каталог

rsync -av./ destination:destPath/dir
7
29.11.2021, 10:07

Вы делаете это так же, как и с большинством инструментов:

  • Вы пишете путь так, чтобы он не начинался с тире, возможно, явно записывая ./или используя абсолютный путь к каталогу.

    rsync...options... /full/path/src./dst
    
  • Вы используете --, чтобы остановить синтаксический анализ опции перед операндами пути:

    rsync...options... -- srcpath dstpath
    

В вашем случае при использовании --следующее создаст /some/other/path/--Archives-как копию каталога --Archives-в текущем каталоге:

rsync -av -- --Archives- /some/other/path

Следующее будет копировать только содержимое --Archives-в каталог назначения:

rsync -av -- --Archives-/ /some/other/path

Важна косая черта в конце исходного пути. Косая черта в конце пути назначения не имеет значения.

Обратите внимание, что редко требуется использовать явное подстановочное значение для исходного пути (s ), если только вы не знаете, что хотите избежать копирования любых скрытых имен из самого верхнего -самого источника пути.

Использование -eв примере команды не требуется, если только вам не нужно вызывать sshособым образом для создания сетевого подключения к вашему источнику или получателю. В примере кода в вопросе вы, кажется, добавляете к исходному пути префикс -e, что, вероятно, является ошибкой (, и вы упоминаете копирование между двумя дисками , что не требует подключения по сети. вообще ).

Кроме того, обратите внимание, что использование-z(сжатия )вряд ли ускорит работу, если только у вас не очень медленное сетевое соединение (, т. е. если вы можете сжимать и распаковывать гораздо быстрее, чем то, что вы можете передавать ). Поэтому нет необходимости использовать -zпри локальном копировании. На самом деле, это может замедлить работу.

14
29.11.2021, 10:10

Теги

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