Linux 是否可以使用/&引用;在文件名中?

Linux 是否可以使用/&引用;在文件名中?,linux,unix,directory,filenames,slash,Linux,Unix,Directory,Filenames,Slash,我知道这不是应该做的事情,但是在Linux中有没有一种方法可以使用斜杠字符来分隔文件名中的目录?如果文件系统支持,您可以使用显示为“/”(例如)的Unicode字符。简短的回答是:不,您不能。这是一个必要的禁止,因为目录结构是如何定义的 而且,如前所述,您可以显示一个“看起来”像斜杠的unicode字符,但这是您所能看到的最远的字符。只能使用商定的编码。例如,您可以同意将%%编码为%%,并且%2F表示/。所有访问此文件的软件都必须理解编码。这取决于您使用的文件系统。在一些更受欢迎的方案中: e

我知道这不是应该做的事情,但是在Linux中有没有一种方法可以使用斜杠字符来分隔文件名中的目录?

如果文件系统支持,您可以使用显示为“/”(例如)的Unicode字符。

简短的回答是:不,您不能。这是一个必要的禁止,因为目录结构是如何定义的


而且,如前所述,您可以显示一个“看起来”像斜杠的unicode字符,但这是您所能看到的最远的字符。

只能使用商定的编码。例如,您可以同意将
%%
编码为
%%
,并且
%2F
表示
/
。所有访问此文件的软件都必须理解编码。

这取决于您使用的文件系统。在一些更受欢迎的方案中:

  • ext3:
  • ext4:
  • jfs:
  • reiserfs:
  • xfs:

    • 答案是,除非您的文件系统有bug,否则您不能这样做。原因如下:

      有一个系统调用,用于重命名在
      fs/namei.c
      中定义的文件,称为
      rename

      SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
                      int, newdfd, const char __user *, newname)
      
      调用系统调用时,它会对名称执行路径查找(
      do\u path\u lookup
      )。继续追踪这一点,我们就可以找到
      链接路径路径行走
      ,它有:

      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可以揭示引擎盖下的情况(简称):


      请注意,这些对
      取消链接的调用将失败,因为它们需要按名称引用文件。

      一般来说,尝试使用“bad”是个坏主意文件名中的所有字符;即使您以某种方式管理它,也会使以后很难使用该文件。文件系统分隔符完全不起作用,因此您需要选择一种替代方法

      您是否考虑过URL编码URL,然后将其用作文件名?作为文件名,结果应该很好,并且很容易从编码版本重建名称


      另一种方法是创建索引-使用您喜欢的任何方法创建输出文件名-按顺序编号的名称、SHA1哈希,无论什么-然后使用生成的文件名/URL对编写文件。您可以将其保存到哈希中,并使用它进行URL到文件名的查找,或者使用哈希的反向版本进行URL到文件名的查找,您可以如果需要,请将其写出来,然后重新加载。

      简短的回答是:您不能。长的回答是,您可能可以,或者取决于您从何处查看以及使用的层

      由于问题中有
      Unix
      标记,我将回答
      Unix

      如其他答案所述,您不能在文件名中使用前斜杠

      但是,在
      MacOS
      中,您可以通过以下方式创建带有正斜杠的文件
      /

      #不惜一切代价避免这样做
      触摸“foo:bar”
      
      现在,当您从终端看到这个文件名时,您将看到它是
      foo:bar

      但是,如果您从
      finder
      :您将看到finder将其转换为
      foo/bar

      同样的事情也可以通过另一种方式完成,如果您从finder创建一个带有斜杠的文件,如
      /foobar
      ,则会在后台进行转换。因此,您将在终端中看到
      :foobar
      ,但从finder查看时则相反

      因此,
      unix层
      中有效,但它在Mac层(如Finder window、GUI)中转换为
      /
      冒号用作
      HFS路径
      中的分隔符,斜杠
      /
      用作
      POSIX路径中的分隔符

      因此,有一种双向转换,这取决于您使用的“层”


      请参阅此处的更多详细信息:

      我猜您可以使用直接访问硬盘分区的方式修改文件名,并在某处使用“/”字符进行修补。发生了什么是一个有趣的问题…很可能不是您想要的。但简短的回答应该是:不,这不是应该做的事情:-)在FS目录条目中的文件名中用斜杠划破是否算数?不建议这样做;您永远无法访问该文件。这让我想起了我的朋友制作了一个名为
      *
      的文件,然后问我,“如何删除文件?”我回答说,
      rm
      后跟文件名。其他的你都知道。对于新的Linux用户,当你对表达式或文件名没有信心时,我认为最好使用
      ls
      列出你要删除的文件,然后在之后将
      ls
      命令更改为
      rm
      。这与d仅在文件系统上,所有*nix系统中的系统调用都会将/作为目录树的一个组件进行解析。正斜杠字符硬编码到内核中,与文件系统无关(请尝试在内核源代码中执行
      grep-r“/”*
      )@tchrist对不起。”Forwa
      $ 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
      ...