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