Bash 如何将$NAUTILUS\u脚本\u当前\u URI转换为路径

Bash 如何将$NAUTILUS\u脚本\u当前\u URI转换为路径,bash,path,uri,Bash,Path,Uri,我需要将带有非拉丁符号的$NAUTILUS\u SCRIPT\u CURRENT\u URI转换为PATH 例如 /home/shara/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/testdir 到 /home/shara/Мбчббчббб/testdir 如何做到这一点?< p>假设>BR>在中间只是一个意外,类似这样的事情: in="/home/shara/%D0%A0%D0%B0%D0%

我需要将带有非拉丁符号的$NAUTILUS\u SCRIPT\u CURRENT\u URI转换为PATH

例如
/home/shara/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9
%20%D1%81%D1%82%D0%BE%D0%BB/testdir

/home/shara/Мбчббчббб/testdir



如何做到这一点?

< p>假设>BR><代码>在中间只是一个意外,类似这样的事情:

in="/home/shara/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/testdir"
eval out=\$\'${in//%/\\x}\'
注意,这不会更正您的区域设置,它只会用匹配的原始字节替换%XX转义。如有必要,您可以使用iconv。此外,如果原始%转义为
%%
,而不是
%25
(您的问题中没有提到这一点),或者如果输入可能包含反斜杠,您也需要考虑这些内容。

我就是这样做的

selected_files=($NAUTILUS_SCRIPT_SELECTED_FILE_PATHS)
for dir in "${selected_files[@]}" ; do
    base=$(readlink -f "$(dirname "$dir")")
done

以下内容改编自(在本例中,我们不需要将“+”替换为“”),将适用于任何POSIX shell,而不仅仅是bash(例如dash):

或者,如果bashisms正常,但您不想调用任何外部程序,则对的稍作修改将为您提供不带“file:”前缀的路径:

最后,如果从脚本中调用python不会困扰您,我强烈建议使用由Glutanimate建议的,因为它免费提供对任意gvfs协议(例如sftp)的支持:

current_nautilus_path=$(python -c 'import gio,sys; print(gio.File(sys.argv[1]).get_path())' "$NAUTILUS_SCRIPT_CURRENT_URI")

避免
eval
out=$(printf“${in//%/\\x}”)
更安全,而且你不必做所有的转义。对于未来的读者:我在askubuntu找到了很好的工作。
percent_decoded_uri=$(printf "${NAUTILUS_SCRIPT_CURRENT_URI//%/\\x}")
current_nautilus_path=${percent_decoded_uri#file://}
current_nautilus_path=$(python -c 'import gio,sys; print(gio.File(sys.argv[1]).get_path())' "$NAUTILUS_SCRIPT_CURRENT_URI")