Windows文件路径转换为Linux文件路径


13

我在bash变量中有一个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

问题

在这里,我对包含文件路径的字符串执行了此操作。我问这个问题的原因是,我必须在Ubuntu 16.04的bash脚本中转换20个这样的字符串,每次执行此操作时,每次转换我必须写2行-这占用了大量空间!

有没有办法结合这两个命令

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

一个命令?


1
使用for循环(可能还有一个数组)。还引用您的变量。
wjandrea

谢谢。您能否显示一个如何在循环或数组中执行此操作的示例?
edesz

Answers:


17

可以使用来一次完成两个替换的方法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" )

好的,但是如果我有2个文件f1f2,它将如何工作?我的意思是,如何通过替换旧文件名将新文件名重新分配给阵列?
edesz

@WR将em放入新数组中并使用它。
muru 17-4-5,0

@WR将其添加到答案中
wjandrea

1
为了清楚起见,我建议创建一个新数组。
wjandrea

9

如果您想多次执行该操作,那么为什么不创建一个小的shell函数呢?

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

这不是一个坏主意。但是,它似乎没有付出/c/Users...-而是付出了C:\Users\...
edesz

@WR道歉-复制粘贴错误。请立即尝试。
steeldriver '17

1
谢谢,我cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }在Linux的Windows子系统中使用它,就像一个魅力!
周末

2

您将能够使用sed在一行中实现此目标

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

请注意,由于匹配被不同的替换所替代,因此这两种模式必须保持分开。


1
同义词:file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
wjandrea

1

这个问题还可以接受新的建议吗?如果是这样,对您有帮助吗?

$ 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

使用的原因是'^C'什么?
edesz

1
^表示该行的开始,否则C的所有出现都将变为小写……如果有的话

我必须补充一点,其他建议也可以。许多Unix命令可以完成相同的工作,因此您可以根据自己的喜好使用哪种解决方案。

我以前没有问过^这个问题,这里也曾在其他答案中使用过。感谢您的回答和解释。
edesz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.