python文件名可以用中文吗_在文件名中可以使用“/”吗?
答案是你不能,除非你的文件系统有一个bug。原因如下:
有一个用于重命名在fs/namei.c中定义的文件的系统调用,称为renameat:SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
当系统调用被调用时,它对名称执行路径查找(do_path_lookup)。继续追踪这个,我们就可以找到link_path_walk这个:static int link_path_walk(const char *name, struct nameidata *nd)
{
struct path next;
int err;
unsigned int lookup_flags = nd->flags;
while (*name=='/')
name++;
if (!*name)
return 0;
...
此代码适用于任何文件系统。这是什么意思?这意味着,如果您尝试使用传统方法传递一个实际的'/'字符作为文件名的参数,它将不会做您想要的事情。无法逃脱这个角色。如果文件系统“支持”这一点,那是因为它们要么:使用unicode字符或看起来像斜线但不是斜线的字符
他们有一只虫子。
此外,如果确实进入并编辑字节以将斜杠字符添加到文件名中,则会发生不好的事情。这是因为您永远不能按名称引用这个文件:(因为无论何时,Linux都会假设您引用的是一个不存在的目录。使用“rm*”技术也行不通,因为bash只是将其扩展到文件名。即使是rm -rf也不起作用,因为一个简单的strace揭示了事情在引擎盖下是如何进行的(简称:$ ls testdir
myfile2 out
$ strace -vf rm -rf testdir
...
unlinkat(3, "myfile2", 0) = 0
unlinkat(3, "out", 0) = 0
fcntl(3, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(3) = 0
unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0
...
注意,这些对unlinkat的调用将失败,因为它们需要按名称引用文件。