1. 概要

この記事では、Linuxでファイル名に「/」文字を追加する可能性について見ていきます。 ファイル名での文字の使用に関するLinuxカーネルの制限について説明してから、renameシステムコールのコードについてもう少し詳しく説明します。

最後に、ファイル名に「/」に似たUnicode文字を含めるために使用できる回避策について説明します。

2. ファイル名に「/」を使用することはできますか?

ファイル名での「/」( Solidus )文字の使用は、システムでの使用のために予約されているため、Linuxによって制限されています。 技術的には、Linuxは「/」文字を区切り文字として使用してディレクトリツリーを整理します。たとえば、Linuxの video0 デバイスには、 / dev/video0を使用してアクセスできます。 パス。 ここでは、devディレクトリとvideo0シンボリックリンクの2つのパスコンポーネントがあります。 これら2つの名前のいずれかに「/」を使用すると、ターゲットファイルの場所にアクセスする機能に影響します。

そのため、ファイル名に「/」文字が含まれていると、Linuxカーネルはパスを正しく解析できません。 したがって、ファイル名に通常の「/」文字を使用することはできません。 NUL文字(\ 0)と呼ばれるもう1つの予約文字があります。これも、Linuxによってファイル名での使用が制限されています。

2.1. システムコールの名前変更

renameat filesystem 呼び出しは、ファイルの検索と名前の変更を担当します。 この呼び出しは、 fs /namei.cファイルで定義されています。 このシステムコールが呼び出されるたびに、パスルックアップが実行されます。 舞台裏では、このパスルックアップは 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;
    ...
}

この関数は、whileステートメントで指定されたファイルパスをウォークスルーします。 ご覧のとおり、「/」区切り文字は関数にハードコーディングされており、エスケープすることはできません。 したがって、このシステムコールはすべてのファイルシステムに適用されるため、使用しているファイルシステムは関係ありません。 ただし、ファイル名に「/」文字を使用できるファイルシステムが見つかった場合は、次の2つの理由が考えられます。

  • 「/」文字は通常のスラッシュではなく、スラッシュのように見えるUnicode文字です。
  • ファイルシステムにバグが含まれています

何らかの理由で、ファイル名に「/」文字、または少なくとも「/」のような文字が必要な場合は、代わりにUnicode文字を使用できます。これについては次に説明します。

3. 回避策:Unicode文字を使用する

ASCII文字セットの各文字について、その文字がUnicodeセットで類似している可能性があります。 すべてのシステムまたはソフトウェアがUnicodeをサポートしているわけではありませんが、それでも主要なLinuxディストリビューションでサポートされている最も広く使用されている標準です。

3.1. Unicodeの「/」の代替

通常のスラッシュ(U + 002F)の代わりに、次の文字を使用できます。

  • U + 2044 =フラクションスラッシュ:⁄
  • U + 2215 =除算スラッシュ:∕
  • U + 29F8 =ビッグソリドゥス:⧸
  • U + FF0F =全幅ソリドゥス:╱
  • U + 2571 =ボックス図面ライト斜め右上から左下:╱

3.2. Linuxのファイル名に代替スラッシュを入れる

Linuxでは、を押してUnicode文字を入力できます。 + +uキー。 キーを押すと、Unicode識別子の入力を求めるプロンプトを示す小文字の下線付きの「u」が表示されます。

ファイルマネージャを開いて試してみましょう。

次に、「2215」コードを入力して、Enterキーを押します。

Unicode文字を含むファイルの名前を変更すると、ファイルのファイル名に「除算スラッシュ」が含まれていることがわかります。

フォントやUnicode文字によっては、文字が他の文字と重なる場合があります。 その場合、他のスラッシュ文字を試して、見栄えの良い文字を選択できます。

同様に、ほとんどのコマンドライン端末にもUnicode文字を挿入できます。 ただし、一部の端末には、Unicode文字を追加する独自の方法がある場合があります。 その場合は、公式ドキュメントを参照してください。

4. 「/」を含むファイル名の修正

ファイル名に通常の「/」が含まれているファイルに対して通常の操作を実行できません。たとえば、「/」文字を区切り文字として扱うため、ファイルを削除できません。 それだけでなく、シェルがワイルドカードを適切なファイル名に展開するため、 rm*を実行することもできません。

幸い、ファイルシステムでfsckユーティリティを実行することで、これらのファイル名を修正できます。ほとんどの主要なLinuxディストリビューションには、 fsck がプリインストールされているため、このユーティリティを使用してスラッシュを削除できます。ファイル名。 実行する前に、ファイルシステムがマウント解除されていることを確認してください。

# fsck -AC

-Aオプションはすべてのパーティションでfsckを実行し、-Cオプションはプログレスバーを表示します。

5. 結論

この記事では、ファイル名に「/」を使用できない理由について説明しました。 次に、ファイル名でこの文字を使用できないようにするコードを簡単に確認しました。 その後、「/」のような他の無制限の代替文字の使用について説明しました。

最後に、 fsck を使用して、「/」文字を含むファイル名を修正する方法を簡単に説明しました。