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

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

我在 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

有一种方法可以同时进行两个替换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

如果这是您想要多次执行的操作,那么为什么不创建一个小的 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

答案3

您可以使用 sed 在一行中实现此目的

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

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

答案4

这个问题是否仍接受新的建议?如果是,这会对你有帮助吗?

$ 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

相关内容