使用nautilus脚本转义路径中的空格
我没想到这件事会这么棘手,但现在我遇到了问题。我想写一个Nautilus脚本,用Python来上传一张或多张图片到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
我试着查找相关文档,但似乎没有太多好的解决方案。至少我没有找到。有没有什么想法?
4 个回答
我在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]
跳过一个评估层次可以看出,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,结果是:
$ 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
保持不变。
使用argv(在Python中是sys.argv
)可以省去很多麻烦。而且环境变量的文档说明也很奇怪,你可以看看。
我认为,$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
应该是用换行符分隔的,而不是用空格分隔的。这样的话,下面的代码在bash中应该可以正常工作:
echo -e $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | xargs python uploader.py