GNU/Linux >> Linux の 問題 >  >> Linux

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

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

  • 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 文字を使用できます。 (分数スラッシュなど)、ファイルシステムでサポートされていると仮定します。


Linux
  1. `find -exec Sh -c`を安全に使用することは可能ですか?

  2. Vimでファイルタイプを使用する方法は?

  3. カスタムPHP.iniファイルを使用する

  1. Linux で .dll を使用可能

  2. BASH で mv を使用してファイル名にタイムスタンプを追加する

  3. shm_open を使用する理由

  1. _roffを使用して単語に下線を付けますか?

  2. chmodを使用してファイルのパーミッションを変更するにはどうすればよいですか?

  3. C でファイル記述子からファイル名を取得する