gsutil rsync исключает шаблоны, не работающие в Windows Powershell - PullRequest
2 голосов
/ 24 сентября 2019

Я пытаюсь скопировать файлы в корзину gs, используя gsutil rsync в powershell, игнорируя некоторые расширения файлов, но я получаю сообщение об ошибке, говорящее, что '. *. Scss' не является командой:

PS W:\> gsutil -m rsync -x ".*^.gz$^|.*^.scss$^|.*^.less$^|.*^.pdf$^|.*^.zip$" -d -r ./ gs://BUCKET
'.*.scssecho' is not recognized as an internal or external command
operable program, or a batch file.

# With the originally proposed solution:
PS W:\> gsutil -m rsync -x '.*\.(gz|scss|less|pdf|zip)$' -d -r ./ gs://BUCKET
'scss' is not recognized as an internal or external command,
operable program, or a batch file.

Документация содержит инструкции по использованию ^ в качестве escape-символа вместо \ и экранирования символа |.Чего мне не хватает?

1 Ответ

2 голосов
/ 24 сентября 2019
  • Используйте одинарные кавычки ('...'), что не позволяет PowerShell интерпретировать строку, особенно символы $.в этом.

  • Поскольку вы передаете регулярное выражение в rsync, используйте обычный \ -экранирование для экранирования regex метасимволов, таких как .

  • Странно, gsutil дополнительно требует, чтобы cmd.exe метасимволы были ^ -экранированными , независимо от вызывающей оболочки иоригинальная цитата , которая в данном случае означает, что | необходимо экранировать, так как ^|

    • js2010 указывает на вероятную причину:gsutil исполняемый файл gsutil.cmd, то есть он реализован как (cmd.exe) пакетный файл - хотя, по-видимому, плохо написан.
# From PowerShell
gsutil -m rsync -x '.*\.gz$^|.*\.scss$^|.*\.less$^|.*\.pdf$^|.*\.zip$' -d -r ./ gs://BUCKET

Кроме того, ваше регулярное выражение может быть упрощено:

# From PowerShell
gsutil -m rsync -x '.*\.(gz^|scss^|less^|pdf^|zip)$' -d -r ./ gs://BUCKET

Общие точки повторения и цитирование:

Это только в cmd.exe что ^ действует как побег;в PowerShell это ` (обратный тик).

Также обратите внимание, что в cmd.exe вам нужно только ^ в аргументах без кавычек , а не внутри "...".

В PowerShell '...' строки воспринимаются буквально (дословно) и вообще не требуют экранирования (за исключением ' как '').

Внутри "...", расширяемые строки, ` должен использоваться для выборочного экранирования $ символов, которые должны быть взяты в качестве литералов, и вы также можете использовать escape-последовательности, такие как `n, для встраивания управляющих символов (в данном случае это новая строка) и,в PowerShell Core дополнительно для вставки символов кода Unicode по их кодовой точке (например, `u{40} для @ символа.)

...