我可以在 Linux 中写一个包含路径分隔符的文件名吗?
Can I write a file name containing path separators in Linux?
我有一个 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
...但我看不出如何转义斜杠,所以这行得通。
您可以 "escape" 将斜杠替换为其他符号(即 _)。当然,可能会出现一些碰撞。但我想文件名中允许存在符号,但服务名称中不允许出现。
更复杂的解决方案:您可以使用类似 base32.
的方式对服务名称进行编码
您不能直接使用带有路径分隔符的文件名。我在那些情况下使用了百分比编码:
import urllib
# outputs "foo%2Fbar"
print urllib.quote('foo/bar', '')
这种解决方案的好处是百分比编码是完全可逆的,因此您可以完美地重建文件名。如果您只是将 /
替换为 _
之类的内容,您将无法知道原始字符是 /
还是 _
。使用百分比编码,您可以,因为它也会转义 %
符号。
我有一个 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
...但我看不出如何转义斜杠,所以这行得通。
您可以 "escape" 将斜杠替换为其他符号(即 _)。当然,可能会出现一些碰撞。但我想文件名中允许存在符号,但服务名称中不允许出现。
更复杂的解决方案:您可以使用类似 base32.
的方式对服务名称进行编码您不能直接使用带有路径分隔符的文件名。我在那些情况下使用了百分比编码:
import urllib
# outputs "foo%2Fbar"
print urllib.quote('foo/bar', '')
这种解决方案的好处是百分比编码是完全可逆的,因此您可以完美地重建文件名。如果您只是将 /
替换为 _
之类的内容,您将无法知道原始字符是 /
还是 _
。使用百分比编码,您可以,因为它也会转义 %
符号。