当我复制任何文件并将其粘贴到控制台或文本编辑器中时,它会被传递为
file:///home/user/path/file
当我将它传递给脚本时找不到它
将其转换为普通 Linux 路径或以某种方式使脚本支持它的最简单方法是什么?
例如
cat file:///home/user/path/file
说
没有这样的文件或目录
答案1
我不知道有任何命令可以在文件 URL 和文件路径之间进行转换,但你可以使用 python 或任何其他与 gio 绑定的语言进行转换。例如:
$ python -c 'import gio,sys; print(gio.File(sys.argv[1]).get_path())' file:///home/user/path/file%20with%20spaces
/home/user/path/file with spaces
答案2
您还可以使用urlencode
(sudo apt-get gridsite-clients
):
$ echo "$(urlencode -d "file:///folder/with%20spaces")"
file:///folder/with spaces
$ echo "$(urlencode -d "file:///folder/with%20spaces"|cut -c 8-)"
/folder/with spaces
如果不需要十六进制支持,则只需使用cut -c 8-
。或者,您可以将 urlencode 与任何其他删除方法file://
(sed、括号扩展等)一起使用。
答案3
file://
要从URL 中删除前缀,可以使用sed:
echo "file:///home/user/path/file" | sed "s/^file:\/\///g"
上述代码的作用是:
- 将 URL 显示到标准输出(因此可以使用 sed 进行修改)
file://
将以 开头的任何行中的所有 替换为空file://
。这实际上会file://
从 URL 中删除,只留下/home/user/path/file
要通过脚本使用它,您可以尝试以下操作:
cat $(echo "file:///home/user/path/file" | sed "s/^file:\/\///g")
现在错误信息是:
cat: /home/user/path/file: No such file or directory
(请注意,它指的是正确的文件名而不是 URL。)
将转换后的文件名存储在 shell 变量中并在之后使用它会更加简洁。
MYFILE=$(echo "file:///home/user/path/file" | sed "s/^file:\/\///g")
cat $MYFILE
答案4
您可以使用它,假设file_path
包含路径:
#!/bin/bash
file_path='file:///home/me/Desktop/path test'
file_path="${file_path#file://}"
echo "${file_path}"
它将打印/home/me/Desktop/path test
。这样,它就可以使用或不使用file://
,只需使用 Bash 字符串操作即可。
您可以将其添加到函数(in .bashrc
)以方便使用:
功能:
norm_path() {
echo "${@#file://}"
}
用法:
cat "$(norm_path file:///home/user/path/file)"