我知道这不是应该做的事情,但是有没有办法使用斜线字符来分隔Linux中文件名中的目录?
*
然后问:“如何删除文件?”的时间。我回答了,rm
然后是文件名。好吧,你知道其余的。
ls
用于列出要删除的文件,然后将ls
命令更改为rm
之后的命令。
我知道这不是应该做的事情,但是有没有办法使用斜线字符来分隔Linux中文件名中的目录?
*
然后问:“如何删除文件?”的时间。我回答了,rm
然后是文件名。好吧,你知道其余的。
ls
用于列出要删除的文件,然后将ls
命令更改为rm
之后的命令。
Answers:
答案是,除非文件系统有错误,否则您将无法这样做。原因如下:
有一个系统调用,用于重命名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;
...
此代码适用于任何文件系统。什么意思 这意味着,如果您尝试'/'
使用传统方式将带有实际字符的参数作为文件名传递,它将无法执行您想要的操作。无法逃脱角色。如果文件系统“支持”此文件,则是因为它们:
此外,如果确实要编辑字节以在文件名中添加斜杠字符,则可能会发生不良情况。那是因为您永远无法使用名称:(来引用该文件,因为无论何时,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
将失败,因为它们需要按名称引用文件。
e2fsck
:p
假设文件系统支持,则可以使用显示为“ /”的Unicode字符(例如,这个看似多余的字形)。
SOLIDUS
,被禁止。还有许多其他合适的候选者:⁄是U + 2044 FRACTION SLASH
;∕是U + 2215 DIVISION SLASH
; ⧸是U + 29F8 BIG SOLIDUS
; /是U + FF0F FULLWIDTH SOLIDUS
,╱是U + 2571是BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
。一切都会令人钦佩!
---
。您选择的分度符可以使用其他字符,并可以改变重复次数。
grep -r "'/'" *
在您的内核源代码中进行)