使用nautilus脚本在路径中转义空格

时间:2010-06-05 12:06:30

标签: python nautilus

我不认为这会像原来那样棘手,但我在这里。我正在尝试用Python编写Nautilus脚本,只需选择并右击它们就可以将一个或多个图像上传到Imgur。它对单个图像和多个图像都有效 - 只要它们不包含任何空格。实际上,您可以上传包含空格的单个图像,而不是多个图像。

问题是NAUTILUS_SCRIPT_SELECTED_FILE_PATHS将所有选定的文件和目录作为空格分隔的字符串返回。例如,它可能看起来像这样:

print os.environment['NAUTILUS_SCRIPT_SELECTED_FILE_PATHS']
/home/nevon/Desktop/test image.png /home/nevon/Desktop/test.jpg

我需要的是一种方法 - 在bash或Python中 - 转义路径中的空格 - 但不是分隔不同项的空格。要么是这样,要么是在每个项目周围加上引号的方法。

最终的解决方案是,如果我可以在bash中执行此操作,然后将项目作为单独的参数发送到我的python脚本。类似的东西:

python uploader.py /home/nevon/Desktop/test\ image.png /home/nevon/Desktop/test.jpg

我尝试过RTFM,但似乎没有很多好的解决方案。至少不是我发现的。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

认为 $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS应该是换行符分隔符,而不是空格分隔符。在这种情况下,以下内容应该来自bash:

echo -e $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | xargs python uploader.py 

答案 1 :(得分:1)

跳过一个级别的评估表明,nautilus文档是不完整的,并且有一种更好的方式,更不用说谁知道多少级别的解释。 Nautilus将所选文件作为脚本参数传递:

$ cat ~/.gnome2/nautilus-scripts/arguments.sh
#!/bin/sh
rm -f /tmp/arguments.*
outf=/tmp/arguments.$$
echo "$0: $#" > $outf
while [ $# -gt 0 ] ; do
    echo "$1"
     if [ ! -r $1 ] ; then echo "cwd is not correct"; fi
    shift
done >> $outf
echo paths $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS >> $outf
for i in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ; do
    echo "+$i+"
done >> $outf

我将输出发送到/tmp因为我不想寻找标准输出。给出:

$ ls -1
a
b
c with space
d
e with space
g

选择目录中的所有文件和Scripts-> arguments.sh yield:

$ cat /tmp/arguments.20447 
/home/msw/.gnome2/nautilus-scripts/arguments.sh: 6
a
b
c with space
d
e with space
g
paths /home/msw/junk/a /home/msw/junk/b /home/msw/junk/c with space 
  /home/msw/junk/d /home/msw/junk/e with space 
  /home/msw/junk/g
+/home/msw/junk/a+
+/home/msw/junk/b+
+/home/msw/junk/c+
+with+
+space+
+/home/msw/junk/d+
+/home/msw/junk/e+
+with+
+space+
+/home/msw/junk/g+

我可以引用$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS来避免这种情况吗?当然。我没有证明使用变量插入多少级别是有问题的,但argv保持不受干扰。

在Python中使用argv(或sys.argv)并省去一些麻烦。还记录了环境variables is weird的语义。

答案 2 :(得分:0)

我无法测试这个,因为我在Windows机器上,但您是否尝试使用$ NAUTILUS_SCRIPT_SELECTED_FILE_URIS?然后,在python中,您可以获得类似以下内容的路径:

[f.strip() for f in os.environment['NAUTILUS_SCRIPT_SELECTED_FILE_URIS'].split('file://') if len(f) > 0]

答案 3 :(得分:0)

事实证明,echo有时会将变量中的换行符转换为空格。以下应该有效:

echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | xargs python uploader.py