Путь файла Windows, преобразованный в путь к файлу Linux

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

После определения 3-х классов, которые были необходимы, читали, записывали и выполняли. Они пошли с восьмеричным (3 бита), чтобы свести к минимуму пространство, необходимое для управления файловой системой.

11
задан 5 April 2017 в 03:29

21 ответ

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

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

Поместить имена файлов в массив Iterate over array

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" )
15
ответ дан 22 May 2018 в 23:58
  • 1
    Хорошо. Но если бы у меня было 2 файла f1 и f2, как это работает? Я имею в виду, как мне переписать новые имена файлов в массив, заменив старые? – W R 5 April 2017 в 03:15
  • 2
    @WR помещает em в новый массив и использует это. – muru 5 April 2017 в 03:30
  • 3
    @WR Добавлено в ответ – wjandrea 5 April 2017 в 04:56
  • 4
    Я бы рекомендовал сделать новый массив, для ясности. – wjandrea 5 April 2017 в 05:03
  • 5
    Большое спасибо. Работал. – W R 5 April 2017 в 06:41

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

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

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

15
ответ дан 31 July 2018 в 10:58

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

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

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

15
ответ дан 31 July 2018 в 11:57

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

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

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

15
ответ дан 31 July 2018 в 23:40

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

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

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

15
ответ дан 14 August 2018 в 21:27

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

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
8
ответ дан 22 May 2018 в 23:58
  • 1
    Это неплохая идея. Однако, похоже, он не дает /c/Users... - вместо этого он дает C:\Users\.... – W R 5 April 2017 в 03:09
  • 2
    @WR извинения - ошибка копирования-вставки. Пожалуйста, попробуйте сейчас. – steeldriver 5 April 2017 в 03:17
  • 3
    Спасибо, я использую cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; } в подсистеме Windows для Linux, работает как шарм! – Weekend 8 May 2018 в 16:06

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

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

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

2
ответ дан 22 May 2018 в 23:58

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

$ 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 '\\' '/')"

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

[ f3]
1
ответ дан 22 May 2018 в 23:58
  • 1
    В чем причина использования '^C'? – W R 28 April 2017 в 03:20
  • 2
    ^ означает начало строки, в противном случае все вхождения C станут строчными ... если есть какие-либо – WillemK 28 April 2017 в 10:25
  • 3
    Я должен добавить, что другие предложения также работают. Многие команды Unix могут выполнять одну и ту же работу, поэтому для вас подходит тот стиль решения, который вы предпочитаете использовать. – WillemK 28 April 2017 в 10:30
  • 4
    Я раньше не спрашивал о ^, который также использовался в некоторых других ответах. Спасибо за ответ и объяснение. – W R 28 April 2017 в 19:16

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

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
8
ответ дан 18 July 2018 в 15:31

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

$ 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
ответ дан 18 July 2018 в 15:31

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

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

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

2
ответ дан 18 July 2018 в 15:31

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

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
8
ответ дан 24 July 2018 в 20:39
  • 1
    Это неплохая идея. Однако, похоже, он не дает /c/Users... - вместо этого он дает C:\Users\.... – W R 5 April 2017 в 03:09
  • 2
    @WR извинения - ошибка копирования-вставки. Пожалуйста, попробуйте сейчас. – steeldriver 5 April 2017 в 03:17
  • 3
    Спасибо, я использую cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; } в подсистеме Windows для Linux, работает как шарм! – Weekend 8 May 2018 в 16:06

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

$ 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
ответ дан 24 July 2018 в 20:39
  • 1
    В чем причина использования '^C'? – W R 28 April 2017 в 03:20
  • 2
    ^ означает начало строки, в противном случае все вхождения C станут строчными ... если есть какие-либо – user 28 April 2017 в 10:25
  • 3
    Я должен добавить, что другие предложения также работают. Многие команды Unix могут выполнять одну и ту же работу, поэтому для вас подходит тот стиль решения, который вы предпочитаете использовать. – user 28 April 2017 в 10:30
  • 4
    Я раньше не спрашивал о ^, который также использовался в некоторых других ответах. Спасибо за ответ и объяснение. – W R 28 April 2017 в 19:16

Вы могли бы добиться этого в одну строку, используя СЭД

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

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

2
ответ дан 24 July 2018 в 20:39
  • 1
    Хорошо. Но если бы у меня было 2 файла f1 и f2, как это работает? Я имею в виду, как мне переписать новые имена файлов в массив, заменив старые? – W R 5 April 2017 в 03:15
  • 2
    @WR помещает em в новый массив и использует это. – muru 5 April 2017 в 03:30
  • 3
    @WR Добавлено в ответ – wjandrea 5 April 2017 в 04:56
  • 4
    Синоним: file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")" – wjandrea 5 April 2017 в 05:01
  • 5
    Я бы рекомендовал сделать новый массив, для ясности. – wjandrea 5 April 2017 в 05:03
  • 6
    Большое спасибо. Работал. – W R 5 April 2017 в 06:41

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

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
8
ответ дан 31 July 2018 в 10:58
  • 1
    Это неплохая идея. Однако, похоже, он не дает /c/Users... - вместо этого он дает C:\Users\.... – W R 5 April 2017 в 03:09
  • 2
    @WR извинения - ошибка копирования-вставки. Пожалуйста, попробуйте сейчас. – steeldriver 5 April 2017 в 03:17
  • 3
    Спасибо, я использую cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; } в подсистеме Windows для Linux, работает как шарм! – Weekend 8 May 2018 в 16:06

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

$ 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
ответ дан 31 July 2018 в 10:58
  • 1
    В чем причина использования '^C'? – W R 28 April 2017 в 03:20
  • 2
    ^ означает начало строки, в противном случае все вхождения C станут строчными ... если есть какие-либо – user 28 April 2017 в 10:25
  • 3
    Я должен добавить, что другие предложения также работают. Многие команды Unix могут выполнять одну и ту же работу, поэтому для вас подходит тот стиль решения, который вы предпочитаете использовать. – user 28 April 2017 в 10:30
  • 4
    Я раньше не спрашивал о ^, который также использовался в некоторых других ответах. Спасибо за ответ и объяснение. – W R 28 April 2017 в 19:16

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

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
8
ответ дан 31 July 2018 в 11:57
  • 1
    Это неплохая идея. Однако, похоже, он не дает /c/Users... - вместо этого он дает C:\Users\.... – W R 5 April 2017 в 03:09
  • 2
    @WR извинения - ошибка копирования-вставки. Пожалуйста, попробуйте сейчас. – steeldriver 5 April 2017 в 03:17
  • 3
    Спасибо, я использую cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; } в подсистеме Windows для Linux, работает как шарм! – Weekend 8 May 2018 в 16:06

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

$ 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
ответ дан 31 July 2018 в 11:57
  • 1
    В чем причина использования '^C'? – W R 28 April 2017 в 03:20
  • 2
    ^ означает начало строки, в противном случае все вхождения C станут строчными ... если есть какие-либо – user 28 April 2017 в 10:25
  • 3
    Я должен добавить, что другие предложения также работают. Многие команды Unix могут выполнять одну и ту же работу, поэтому для вас подходит тот стиль решения, который вы предпочитаете использовать. – user 28 April 2017 в 10:30
  • 4
    Я раньше не спрашивал о ^, который также использовался в некоторых других ответах. Спасибо за ответ и объяснение. – W R 28 April 2017 в 19:16

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

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
8
ответ дан 31 July 2018 в 23:40
  • 1
    Это неплохая идея. Однако, похоже, он не дает /c/Users... - вместо этого он дает C:\Users\.... – W R 5 April 2017 в 03:09
  • 2
    @WR извинения - ошибка копирования-вставки. Пожалуйста, попробуйте сейчас. – steeldriver 5 April 2017 в 03:17
  • 3
    Спасибо, я использую cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; } в подсистеме Windows для Linux, работает как шарм! – Weekend 8 May 2018 в 16:06

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

$ 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
ответ дан 31 July 2018 в 23:40
  • 1
    В чем причина использования '^C'? – W R 28 April 2017 в 03:20
  • 2
    ^ означает начало строки, в противном случае все вхождения C станут строчными ... если есть какие-либо – user 28 April 2017 в 10:25
  • 3
    Я должен добавить, что другие предложения также работают. Многие команды Unix могут выполнять одну и ту же работу, поэтому для вас подходит тот стиль решения, который вы предпочитаете использовать. – user 28 April 2017 в 10:30
  • 4
    Я раньше не спрашивал о ^, который также использовался в некоторых других ответах. Спасибо за ответ и объяснение. – W R 28 April 2017 в 19:16

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

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
8
ответ дан 5 August 2018 в 05:34

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

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