Windows filepath преобразованный в Linux filepath

У меня есть путь Windows в переменной удара как строка:

file='C:\Users\abcd\Downloads\testingFile.log'

Я пытаюсь преобразовать этот путь к пути Linux, запускающемуся с /c/Users....

Моя попытка

Следующие работы:

file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log

Проблема

Здесь, я сделал это для строки, которая содержит filepath. Причина, которую я задаю этому вопросу, состоит в том, что я должен преобразовать 20 таких строк в сценарии удара в Ubuntu 16.04 и каждый раз, когда я делаю это, я должен записать 2 строки на преобразование - это поднимает много пространства!

Вопрос

Есть ли способ объединить 2 команды

file=${file/C://c}
file=${file//\\//}

в одну команду?

13
задан 4 April 2017 в 17:29

4 ответа

Был бы способ сделать обе замены сразу с помощью sed, но это не необходимо.

Вот то, как я решил бы эту проблему:

  1. Помещенные имена файлов в массиве
  2. Выполняют итерации по массиву

filenames=(
  'C:\Users\abcd\Downloads\testingFile.log'
  # ... add more here ...
)

for f in "${filenames[@]}"; do
  f="${f/C://c}"
  f="${f//\\//}"
  echo "$f"
done

, Если Вы хотите поместить вывод в массив вместо печати, замените echo строка с присвоением:

  filenames_out+=( "$f" )
17
ответ дан 23 November 2019 в 03:13

Если это то, что вы хотите сделать много раз, то почему бы не создать небольшую функцию оболочки?

win2lin () { f="${1/C://c}"; printf '%s\n' "${f//\\//}"; }

$ file='C:\Users\abcd\Downloads\testingFile.log'
$ win2lin "$file"
/c/Users/abcd/Downloads/testingFile.log
$ 
$ file='C:\Users\pqrs\Documents\foobar'
$ win2lin "$file"
/c/Users/pqrs/Documents/foobar
9
ответ дан 23 November 2019 в 03:13

Вы смогли бы достигнуть этого в одной строке с помощью Примечания sed

file="$(echo "$file" | sed -r -e 's|^C:|/c|' -e 's|\\|/|g')"

, эти два шаблона должны остаться отдельными, тем не менее, поскольку соответствия заменяются различными заменами.

2
ответ дан 23 November 2019 в 03:13

Этот вопрос все еще открыт для новых предложений? Если да, то поможет ли это вам?

$ file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '\\' '/')"
$ echo $file
/C:/Users/abcd/Downloads/testingFile.log

О, и в случае, если буква C должна быть приведена к нижнему регистру:

file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '^C' 'c'|tr '\\' '/')"

В качестве обзора:

$ file='C:\Users\abcd\Downloads\testingFile.log'
$ echo $file
C:\Users\abcd\Downloads\testingFile.log
$ file="/$(echo $file|tr '^C' 'c'|tr '\\' '/')"
$ echo $file
/c:/Users/abcd/Downloads/testingFile.log
1
ответ дан 23 November 2019 в 03:13

Другие вопросы по тегам:

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