【问题标题】:Can I write a file name containing path separators in Linux?我可以在 Linux 中编写包含路径分隔符的文件名吗?
【发布时间】:2015-12-31 15:30:22
【问题描述】:

我有一个 Python 程序,它会因 Nagios 检查失败而被触发并调用工程师。作为其中的一部分,它使用作为文件名的一部分失败的服务的名称来保存状态文件。这很好,除了一些服务包含斜杠(例如,用于检查是否存在 NFS 挂载点,该服务只是以挂载点命名),当 python 尝试使用此名称创建文件时,它会解释命名为目录树(树的某些部分不存在)并失败。

显然有一些方法可以解决这个问题(例如,我可以停止在文件路径中使用服务名称),但我非常喜欢它目前的设计方式,因为我可以判断给定服务的状态文件是否已经存在无需读取目录中的每个状态文件。有什么办法可以写一个包含路径分隔符的文件名?

我所追求的是这样的:

service_name = '/data/servername'
filename = escape_service_name(service_name)
statepath = os.join(state_dir, filename)
statefile = open(statepath, "w")
# Write state file details here

...但我看不出如何逃避斜线,所以这行得通。

【问题讨论】:

  • 您希望实际文件名包含路径分隔符吗?如果是这样,我看不出如果操作系统使用那些完全相同的符号将路径分解为目录和文件名,那会怎样。否则,如果我误解了,您是否尝试过使用原始字符串?例如,类似于r'/data/servername'
  • 是的,或者一些可行的转义序列。我不知道 Linux 是否可以通过适当的转义来允许它。不过,Dragonroot 的答案应该有效。

标签: python linux path escaping


【解决方案1】:

您不能直接使用带有路径分隔符的文件名。在这些情况下我使用了百分比编码:

import urllib

# outputs "foo%2Fbar"
print urllib.quote('foo/bar', '')

这种解决方案的好处是百分比编码是完全可逆的,因此您可以完美地重建文件名。如果您只是将/ 替换为_,您将无法知道原始字符是/ 还是_。使用百分比编码,您可以,因为它也会转义 % 符号。

【讨论】:

  • 是啊,没想到,我想我会尝试这种方式。谢谢。 :-)
【解决方案2】:

您可以通过将斜杠替换为其他符号(即_)来“转义”斜杠。当然,可能会出现一些冲突。但我猜在文件名中允许存在符号,但在服务名称中没有出现。

更复杂的解决方案:您可以使用 base32 之类的方式对服务名称进行编码。

【讨论】:

  • 是的,我想只是替换名称中的斜杠,但后来我有一些其他字符(或一组字符)不能出现在服务名称中,如果还有其他字符这给出了我没有想到的类似问题,以后我又遇到了同样的问题。如果没有办法做到这一点,仍然是最有可能的解决方案。 Base32 没有帮助,因为我还需要对斜杠(以及存在的任何其他特殊字符)进行编码。
  • 你错了:base32 允许你引用任何字节序列。结果,您将获得一系列字母和数字(和=,但可以省略)。而且它也是完全可逆的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 2019-06-04
相关资源
最近更新 更多