使用しているファイルシステムによって異なります。より人気のあるもののいくつか:
- ext3:いいえ
- ext4:いいえ
- jfs:はい
- reiserfs:いいえ
- xfs:いいえ
答えは、ファイルシステムにバグがない限り、できないということです。理由は次のとおりです。
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;
...
このコードは、すべてのファイル システムに適用されます。これはどういう意味ですか?実際の '/'
でパラメーターを渡そうとすると、 従来の方法を使用してファイルの名前として文字を使用すると、希望どおりの結果が得られません。キャラクターから逃れる方法はありません。ファイルシステムがこれを「サポート」している場合、それは次のいずれかのためです:
- Unicode 文字または見える文字を使用する スラッシュに似ていますが、そうではありません。
- バグがあります。
さらに、あなたがした場合 バイトを編集してファイル名にスラッシュ文字を追加すると、悪いことが起こります。これは、このファイルを名前で参照することは決してできないためです:(いつでも、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
への呼び出しに注意してください ファイルを名前で参照する必要があるため失敗します。
合意されたエンコーディングのみ。たとえば、%
に同意することができます。 %%
としてエンコードされます そしてその %2F
/
を意味します .このファイルにアクセスするすべてのソフトウェアは、エンコーディングを理解する必要があります。
/
として表示される Unicode 文字を使用できます。 (分数スラッシュなど)、ファイルシステムでサポートされていると仮定します。