我知道这不是应该做的事情,但在Linux中是否有一种方法可以使用通常用于文件夹之间分隔符的斜线字符作为文件名的一部分?
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
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;
...
'/'
的参数作为文件名传递,它不会按照你的意愿执行。没有办法转义这个字符。如果一个文件系统“支持”这个,那是因为它们要么:
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
的一个 bug :p - flarn2006/
(例如分数斜线),假设您的文件系统支持它。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
。它们都能完美地发挥作用! - tchristgrep -r "'/'" *
)。 - Robert Martin%
将被编码为%%
,而%2F
将表示/
。所有访问此文件的软件都必须了解编码。/
的文件:# avoid doing it at all cost
touch 'foo:bar'
foo:bar
。foo/bar
。/foobar
,那么后台会进行一次转换。结果,在终端中你会看到:foobar
,但是从Finder中查看则是另一种方式。:
在Unix层中是有效的,但在Mac层中(如Finder窗口、GUI)却被翻译成或者从/
翻译而来。在HFS路径中,冒号:
被用作分隔符,在POSIX路径中,斜线/
被用作分隔符。
*
的文件,然后问我:“怎么删除这个文件?” 我回答说,用rm
命令加上文件名即可。你知道后面发生了什么。 - David Heffernanls
列出要删除的文件,然后将ls
命令更改为rm
是一个好习惯。 - Dave F