これは実行すべきことではないことを知っていますが、通常Linuxのファイル名内のディレクトリを区切るスラッシュ文字を使用する方法はありますか?
*
、「ファイルを削除するにはどうすればよいですか?」私は答え、rm
ファイル名を続けました。さて、あなたは残りを知っています。
ls
して削除するファイルを一覧表示し、ls
コマンドをrm
後で変更することをお勧めします。
これは実行すべきことではないことを知っていますが、通常Linuxのファイル名内のディレクトリを区切るスラッシュ文字を使用する方法はありますか?
*
、「ファイルを削除するにはどうすればよいですか?」私は答え、rm
ファイル名を続けました。さて、あなたは残りを知っています。
ls
して削除するファイルを一覧表示し、ls
コマンドをrm
後で変更することをお勧めします。
回答:
答えは、ファイルシステムにバグがない限り、できません。理由は次のとおりです。
で定義されたファイル名の変更のためのシステムコールがある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は存在しないディレクトリを参照していると想定します。bashは単にファイル名に展開するため、「rm *」手法を使用しても機能しません。でも、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
ファイル名は修正が必要な不正なファイル名と見なされます。ソースを参照してください。したがって、スラッシュが含まれているファイル名が何らかの理由で終わる場合は、を使用fsck
して問題を修正できます。
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 "'/'" *
カーネルソースで実行してみてください)
合意されたエンコーディングでのみ。たとえば、が%
としてエンコードされ%%
、が%2F
を意味することに同意できます/
。このファイルにアクセスするすべてのソフトウェアは、エンコーディングを理解する必要があります。
一般に、ファイル名に「不正な」文字を使用することはまったくお勧めできません。どういうわけかそれを管理しても、後でファイルを使用するのが難しくなる傾向があります。ファイルシステムセパレーターは完全に機能しないため、別の方法を選択する必要があります。
URLをURLエンコードしてから、それをファイル名として使用することを検討しましたか?結果はファイル名として問題ないはずであり、エンコードされたバージョンから名前を簡単に再構築できます。
別のオプションは、インデックスを作成することです。好きな方法で出力ファイル名を作成します-連番の名前、SHA1ハッシュなど、次に、生成されたファイル名/ URLペアでファイルを書き込みます。これをハッシュに保存し、それを使用して、URLからファイル名へのルックアップを実行したり、ハッシュの逆のバージョンでその逆を実行したりできます。また、必要に応じて、それを書き出し、後で再ロードできます。