当前位置: 首页 > 面试题库 >

可以在文件名中使用“ /”吗?

赖俊
2023-03-14
问题内容

我知道这不是应该做的事情,但是有没有办法使用斜线字符来分隔Linux中文件名中的目录?


问题答案:

答案是,除非文件系统有错误,否则您将无法这样做。原因如下:

有一个系统调用,用于重命名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将失败,因为它们需要按名称引用文件。



 类似资料:
  • 问题内容: 我想使用“ $ set”更新嵌入式文档,但是该字段是变量。 说我有一个像这样的文件: 现在,我要向添加一个新人。我可以使用,但是如果名称(而不是B)是变量怎么办? 我正在使用Node.js 5.1和’mongodb’驱动程序。 问题答案: 您需要使用运算符动态构建查询。

  • 我想使用两个jar文件中的资源文件。可能吗? build.gradle 这意味着,我想包含同样来自libs/myOwnFile-1.jar文件的资源文件(主要是xml文件)。jar是由其他团队创建的,但它是另一个项目,不能与此项目关联。但是我知道资源的路径(src/resources) 是否可以在 jar 文件下使用 src/资源?

  • 这很有效,但问题是GCS中的文件名与原始文件名不一样(似乎只是blobkey)。 我可以做同样的但在GCS中有原始文件名吗?

  • 问题内容: 我想命名一个CSS类,并将其命名为imgSuper。我可以在CSS类中使用camelCasing吗? 问题答案: 从技术上讲是可以的,但是这是有风险的,因为CSS语法几乎不区分大小写,但是在某些情况下,在某些浏览器中,类名被视为区分大小写,因为规范未指定将CSS规则与HTML类匹配时浏览器应如何处理大小写名称。 从规范,4.1.3节: 所有CSS语法在ASCII范围内都不区分大小写…

  • 问题内容: 我能够获取当前目录的完整路径,现在我想创建一个函数,该函数将读取或获取执行代码的文件名。我可以获取文件名,但是它返回编写代码的原始文件名: 我想要做的是获取执行代码的当前文件名,例如: 我创建了: 然后当我在不同位置调用不同文件时 它会返回。 我已经在这里停留了一段时间,正在寻找答案。 问题答案: 基本上,这就是您告诉/传递给的内容:返回条目之前要跳过的堆栈条目数。 如果你通过在你的代

  • 问题内容: 我正在构建一个库,但我也希望它可以作为独立的二进制文件使用。 例如,假设我正在构建Tar的实现。Tar通常用作命令,但也可以用作库。凭直觉,我会做这样的事情: 不过,这似乎不起作用。从文档中看来,“命令”应该具有与库不同的名称。使此处给出的示例适应此示例,我具有以下目录结构: 但是,这会创建一个名为的命令,而不是中的命令。我发现的解决方法是执行,但是我感觉到自己在做错误的事情。有没有更