ファイル名に「/」を使用できますか?


111

これは実行すべきことではないことを知っていますが、通常Linuxのファイル名内のディレクトリを区切るスラッシュ文字を使用する方法はありますか?


1
hardiskパーティションへの直接アクセスを使用してファイルの名前を変更し、どこかに「/」文字でパッチを当てることができると思います。何が起こるかは興味深い質問です...おそらくあなたが望むものではないでしょう。
hochl

1
しかし、短い答えは次のとおりです。いいえ、これはこれまでに行われるべきことではありません:-)
Simeon Visser

スラッシュをFSカウントのディレクトリエントリのファイル名にハッキングしますか?それはお勧めできません。ファイルにアクセスすることはできません。
ジョナサンレフラー

35
これは、私の友人がという名前のファイルを作成し*、「ファイルを削除するにはどうすればよいですか?」私は答え、rmファイル名を続けました。さて、あなたは残りを知っています。
David Heffernan

1
新しいLinuxユーザーの場合、式やファイル名に自信がない場合は、を使用lsして削除するファイルを一覧表示し、lsコマンドをrm後で変更することをお勧めします。
デイブF

回答:


129

答えは、ファイルシステムにバグがない限り、できません。理由は次のとおりです。

で定義されたファイル名の変更のためのシステムコールがある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は存在しないディレクトリを参照していると想定します。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、ファイルを名前で参照する必要があるため失敗することに注意してください。


8
また、少なくともe2fsckファイル名は修正が必要な不正なファイル名と見なされます。ソースを参照してください。したがって、スラッシュが含まれているファイル名が何らかの理由で終わる場合は、を使用fsckして問題を修正できます。
ehabkost 2012

4
@ehabkost 任意のファイル名?e2fsck:pのバグのように
聞こえます

36

ファイルシステムがサポートしている場合、「/」として表示されるUnicode文字(たとえば、これは一見冗長なグリフ)を使用できます。


42
はい、正確に:U + 002F 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。すべてが見事に機能します!
tchrist

2
しかし、ユーザーがファイル/ディレクトリ名にこれらの実際の文字を使用するとどうなるでしょうか。一般的なエスケープソリューションが必要です。Linux 0の通常のコードは文字通りASCII 0x2Fに一致するため、あまりサポートされていません。ASCIIは、少なくとも20年以来、大きな禁止事項です。(Unicode 1.0は1991からです!)
Evi1M4chine

@tchrist私はユニコードに依存しないことを好みます。だから私はおそらくのような複数文字の区切り文字を好むでしょう---。デリミタの選択では、別の文字を使用したり、繰り返し数を変更したりできます。
Trevor Boyd Smith

:異なるファイルシステムの下で禁止されている数多くの文字上で可能な代替品のリスト、私の答えを見ているためstackoverflow.com/a/61448658/4575793
Cadoiz

9

使用しているファイルシステムによって異なります。より人気のあるもののいくつか:


1
ファイルシステムだけに依存するのではなく、すべての* nixシステムのシステムコールは/をディレクトリツリーのコンポーネントとして解析します。
Blackle Mori

2
スラッシュ文字は、ファイルシステムとは関係なく、カーネルにハードコードされています(grep -r "'/'" *カーネルソースで実行してみてください)
Robert Martin

20
@tchristすみません。「スラッシュ」は、スラッシュ文字を参照して、どのスラッシュが参照しているかを完全に明確にするための完全に受け入れ可能な方法です。時々人々は混乱します:P
ロバートマーティン

2
ああ、でも@tchristにもポイントがあると思います。forwardが「/」を意味し、「back」が「\」を意味するのはなぜですか?これまでの最高の説明は、線で始まるペンで下から上に書くと、読み書き時に「/」が右または「前方」に移動し、「\」が「左」または「後方」に移動することです。左から右へ。でも、下から文字を書いて上に上がらないこともあるので、その説明はあまり好きではありません。キャラクターを書いている最中に上から下に移動すると、多くの場合上手く流れると思います。
ジェシーWコリンズ

4
@jwsoこれは完全に副次的ですが、これは標準の標準言語です。スラッシュは、Unicodeがこれらのように見えるシンボルを呼び出すものではなく、それをソリダスと呼びますが、「\」は逆ソリダスであり、逆方向、つまりバックスラッシュと同義です。しかし、正当化が必要な場合、前後は線が傾く方向または下がる方向であり、方向は書き込み方向(左から右)に基づきます。「\」のように見える場合は傾くか、<==または後方に下がり、「/」のように見える場合は==>または進む。
スチュアートR.ジェフリーズ2018年

4

合意されたエンコーディングでのみ。たとえば、が%としてエンコードされ%%、が%2Fを意味することに同意できます/。このファイルにアクセスするすべてのソフトウェアは、エンコーディングを理解する必要があります。


19
「他の名前でスラッシュと呼ぶものは、悪臭を放つだろう」-シェイクスピア
ロバート・マーティン

1

簡単に言えば、いいえ、できません。ディレクトリ構造がどのように定義されているかにより、これは必要な禁止事項です。

また、前述のように、スラッシュのように見えるUnicode文字を表示できますが、それは可能な限りの範囲です。


1

一般に、ファイル名に「不正な」文字を使用することはまったくお勧めできません。どういうわけかそれを管理しても、後でファイルを使用するのが難しくなる傾向があります。ファイルシステムセパレーターは完全に機能しないため、別の方法を選択する必要があります。

URLをURLエンコードしてから、それをファイル名として使用することを検討しましたか?結果はファイル名として問題ないはずであり、エンコードされたバージョンから名前を簡単に再構築できます。

別のオプションは、インデックスを作成することです。好きな方法で出力ファイル名を作成します-連番の名前、SHA1ハッシュなど、次に、生成されたファイル名/ URLペアでファイルを書き込みます。これをハッシュに保存し、それを使用して、URLからファイル名へのルックアップを実行したり、ハッシュの逆のバージョンでその逆を実行したりできます。また、必要に応じて、それを書き出し、後で再ロードできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.