I know that this is not something that should ever be done, but is there a way to use the slash character that normally separates directories within a filename in Linux?
相关问题
- Is shmid returned by shmget() unique across proces
- How to access the camera from my Windows Phone 8 a
- how to get running process information in java?
- Error building gcc 4.8.3 from source: libstdc++.so
- Why should we check WIFEXITED after wait in order
Only with an agreed-upon encoding. For example, you could agree that
%
will be encoded as%%
and that%2F
will mean a/
. All the software that accessed this file would have to understand the encoding.The answer is that you can't, unless your filesystem has a bug. Here's why:
There is a system call for renaming your file defined in
fs/namei.c
calledrenameat
:When the system call gets invoked, it does a path lookup (
do_path_lookup
) on the name. Keep tracing this, and we get tolink_path_walk
which has this:This code applies to any file system. What's this mean? It means that if you try to pass a parameter with an actual
'/'
character as the name of the file using traditional means, it will not do what you want. There is no way to escape the character. If a filesystem "supports" this, it's because they either:Furthermore, if you did go in and edit the bytes to add a slash character into a file name, bad things would happen. That's because you could never refer to this file by name :( since anytime you did, Linux would assume you were referring to a nonexistent directory. Using the 'rm *' technique would not work either, since bash simply expands that to the filename. Even
rm -rf
wouldn't work, since a simple strace reveals how things go on under the hood (shortened):Notice that these calls to
unlinkat
would fail because they need to refer to the files by name.The short answer is: No, you can't. It's a necessary prohibition because of how the directory structure is defined.
And, as mentioned, you can display a unicode character that "looks like" a slash, but that's as far as you get.
You could use a Unicode character that displays as "/" (for example this seemingly redundant glyph) assuming your filesystem supports it.
In general it's a bad idea to try to use "bad" characters in a file name at all; even if you somehow manage it, it tends to make it hard to use the file later. The filesystem separator is flat-out not going to work at all, so you're going to need to pick an alternative method.
Have you considered URL-encoding the URL then using that as the filename? The result should be fine as a filename, and it's easy to reconstruct the name from the encoded version.
Another option is to create an index - create the output filename using whatever method you like - sequentially-numbered names, SHA1 hashes, whatever - then write a file with the generated filename/URL pair. You can save that into a hash and use it to do a URL-to-filename lookup or vice-versa with the reversed version of the hash, and you can write it out and reload it later if needed.
It depends on what filesystem you are using. Of some of the more popular ones: