Изменить путь с помощью sed и использовать результат в функции копирования? - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно конвертировать некоторые файлы .sh в .cmd, потому что я нахожусь под Windows - но с Mingw64 и некоторыми утилитами linux (такими как sed, grep и т.д ...).

Я борюсь с небольшой проблемой: у меня есть сценарий в .sh, который является путями Linux, поэтому с /, например: FILEPATH=/opt/My/Troublesome/Path

Поскольку я не хочу переписывать все пути, я просто скопировал / вставил их в .cmd следующим образом: set "FILEPATH=/opt/My/Troublesome/Path" Затем я создал каталог opt в C :, и Windows может найти этот путь. Я могу сделать cd %FILEPATH% без проб.

Однако, copy не так хорош. когда я пытаюсь copy %FILEPATH%/Myfile . он жалуется на синтаксис. Когда я делаю то же самое с двойной кавычкой, он говорит, что файл не найден.

Я пытался использовать sed, чтобы изменить путь и скопировать его в одну строку, но мне не удается заставить его работать. я сделал:

echo "/opt/My/Troublesome/Path/Myfile ." | sed "s~\/~\\~g"

и это дает мне: \opt\MyTroublesome\Path\Myfile .

Так как это именно то, что я хочу, я пытался передать его для копирования, но это не работает (в любом случае, я никогда не был хорош с pipe):

echo "/opt/My/Troublesome/Path/Myfile ." | sed "s~\/~\\~g" | copy

Там написано неверный синтаксис. Я пробовал намного больше вещей, например: copy < echo "/opt/My/Troublesome/Path/Myfile ." | sed "s~\/~\\~g" но все еще не работает.

Более того, это то, что я пробовал в моей оболочке Mingw, не уверен, что изменится в скрипте с помощью переменной% FILEPATH%.

Есть идеи? Возможно ли это сделать в одну строку?

PS: так как я получил sed, я почти уверен, что смогу получить cp. Но я бы хотел, чтобы в моем .cmd было как можно меньше функций linux. sed будет использоваться в нем позже, так что это нормально, потому что у окон нет эквивалента, но, поскольку copy существует на окнах, нет смысла использовать cp

1 Ответ

0 голосов
/ 13 июня 2019

Команда copy ожидает, что пути будут предоставлены в качестве аргументов командной строки, поэтому вы не можете передать их, используя pipe (|) .

Вы можете сохранить путь в стиле Unix / Linux в переменной, затем использовать подстрока для замены каждого / на \ и сразу же использовать результат командой copy:

rem // Store Unix-(Linux-)style path in variable:
set "FILEPATH=/opt/My/Troublesome/Path"
rem // Precede drive and replace `/` by `\`:
copy "C:%FILEPATH:/=\%\MyFile" .
...