【问题标题】:Escape whitespace in paths using nautilus script使用 nautilus 脚本转义路径中的空格
【发布时间】:2013-02-18 17:14:59
【问题描述】:

我不认为这会像结果那样棘手,但我来了。我正在尝试用 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,但似乎没有很多好的解决方案。至少我没有找到。有什么想法吗?

【问题讨论】:

  • python uploader.py '...test image.png' ... 但这属于 superuser.com
  • mv 'test image.png' test-image.png。是的,你可以在文件名中使用空格,但没有人说它在所有情况下都很有趣。
  • 我知道你可以引用参数来允许空格,但是当 $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS 只是给我一个空格分隔的列表时我该怎么做呢?

标签: python nautilus


【解决方案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 生成:

$ 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)并省去一些麻烦。还有环境variables is weird的记录语义。

【讨论】:

  • 谢谢,"$1" 在 bash 中为我工作。
【解决方案2】:

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

echo -e $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | xargs python uploader.py 

【讨论】:

  • 这也是我读过的,但这是我从 echo -e $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS > output /home/nevon/Desktop/test image.png /home/nevon/Desktop/test 得到的输出。 gif
  • 嗯,我猜 cmets 不允许段落。无论如何,不​​管文档怎么说,它是一个空格分隔的列表。很遗憾,您的建议没有奏效。
  • 我将此标记为正确。起初它不起作用,但现在突然它起作用了。我不确定我第一次做错了什么,但现在可以了。我确实必须这样做:echo -e $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | xargs --delimiter="\n" python uploader.py 但是现在可以了!
  • 你不得不佩服在不知道它是如何工作的情况下使用答案的勇气,赞!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2013-08-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多