web-dev-qa-db-ja.com

Linux、Windows、OS-Xのクロスプラットフォームファイル名で安全な文字

現在、ほとんどのファイルにYYMMDD-NAME+PAGEという名前を使用しています。 NAMEにはスペースがアンダースコアに変換されます。

YYYY-MM-DDの日付形式を使用したいのですが、名前と区別する方法がわかりません。名前が数字で始まっている場合、-は奇妙に見えます。 _を使用すると、スペースを表すアンダースコアと競合します。

ここで機能するファイル名に適度に安全な文字は何ですか? Linuxを使用していますが、他のユーザー(Windows 7、Mac OS X)とファイルを共有する場合があります。

66
Martin Ueding

概要:

  • Windows:ASCIIの制御文字と\/:*?"<>|を除くすべて
  • Linux、OS-X:nullまたは/を除くすべて

すべてのプラットフォームで、ASCII制御文字などの印刷できない文字を避けることをお勧めします。

Windows

Windowsでは、Windowsエクスプローラーは制御文字または\/:*?"<>|を許可しません。スペースを使用できます。スペースを使用する場合、コマンドラインから使用する場合はファイル名を引用する必要があることがよくあります(ただし、私の知る限り、GUIアプリは影響を受けません)。 NTFSなどのWindowsファイルシステムは、エンコーディングをファイル名とともに格納するようですが、UTF-16が標準です。

Windowsの一部は大文字と小文字を区別し、他の部分は大文字と小文字を区別しません。 Windows NTFSファイルシステムでは、「Ab」や「ab」などの異なるファイル名を簡単に作成できます。これらの名前は、異なる個別のコンテンツを含む個別のファイルを指します。ただし、Windowsのコマンドプロンプトでは、dirを使用して両方のファイルを一覧表示できますが、typeなどのコマンドを使用してファイルの1つに簡単にアクセスしたり操作したりすることはできません。下記参照。

Linux、OS-X

LinuxおよびOS-Xでは、印刷可能なASCIIセットの/のみが禁止されていると思います。一部の文字(*?!などのシェルメタ文字)は、コマンドラインで問題を引き起こし、ファイル名を適切に引用またはエスケープする必要があります。

Ext2、ext3などのLinuxファイルシステムは、文字セットに依存しません(多かれ少なかれバイトストリームとして扱われると思います。nullと/のみが禁止されています)。つまり、ファイル名をUTF-8エンコーディングで保存できます。表示または処理のためにファイル名を適切に変換するためにどのエンコーディングを使用するかを知るのは、シェルまたは他のアプリケーションに任されていると思います。

結論

したがって、おそらくのようなものを安全に使用できます(タイプするのがそれほど難しくなかった場合)


Windowsでの大文字と小文字の区別

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

2番目のファイルの内容を入力できないことに注意してください。Windowsのtypeコマンドは、代わりにAbの内容を返します。 3番目のファイルもLinuxのaBとは異なります。

(Windows 10 NTFS)。

52
RedGrittyBrick

RedGrittyBrickの答えは技術的に正しいですが、安全性だけが問題ではありません。使いやすさも重要です。より良い質問は、「ファイル名に使用するのに適した文字は何か」だと思います。

いくつかの潜在的なガイドライン:

  • [0-9a-zA-Z _]-英数字とアンダースコアは常に使用できます。
  • _\/:*?"<>|_およびnullバイトは少なくとも問題があります1つのシステムであり、常にを回避する必要があります。
  • スペースは多くのシステムで引数のセパレータとして使用されるため、スペースを含むファイル名は可能な限り避ける必要があります。その他の空白(タブなど)はさらにそうです。
  • セミコロン(;)は、多くのシステムでコマンドを区切るために使用されます。 セミコロンとコンマ(、)は、(のいくつかのバージョン?)のコマンドライン引数を区切るために使用されますWindowsコマンドライン。
  • []()^ #%&!@:+={}'~[`]はすべて特別です多くのシェルで意味があり、回避するのが面倒なので、回避する必要があります。それらも RLでひどく見える傾向がある です。
  • 先頭の文字を避けるために:
    • 多くのコマンドラインプログラムは、特殊な引数を示すためにハイフン[-]を使用します。
    • * nixベースのシステムでは、隠しファイルおよび隠しディレクトリの先頭文字として全ストップ[。]を使用します。
  • ASCIIセットにないものは、古いまたはより基本的なシステム(たとえば、一部の組み込みシステム)で問題を引き起こす可能性があるため、注意して使用してください。

基本的には次のとおりです。

[0-9a-zA-Z -._]

それは常に安全で使用に迷惑をかけない(ファイル名を英数字で始める限り):)

52
naught101

あなたは出来る:

  1. 現在の下線を#(スペースの校正者の記号)に置き換えます
  2. ファイル名から「セクション」の日付に下線(または2番目のハイフン-入力しやすい)

Alt-1。先頭の大文字はスペースを置き換えることができます:YYMMDD-HHMM-FileName.extまたはYYMMDD-HHMM_FileName.ext

明確に表示するための最小限の文字。1月9月(および1st-9th ea mo)の埋め込みゼロで自動ソートされます。

4
tb01

考慮すべき追加の側面を指摘しますが、登場人物は主に他の人々によって扱われました。まず、2つの問題があるYYMMDDの選択について説明します。

YYMMDDの最初の問題は、履歴データに対して機能しないことです。以前ではなく、2035年よりもずっと後に1997年にソートされます。それが問題であるかどうかは、フォーマットをどの程度広めたいかによって異なります。

YYMMDDのもう1つの問題は、カレンダーの信頼性に関連しています。グレゴリオ暦は現在、世界で最も人気のあるカレンダーですが、誰もがそれを使用したり、参照でその日に気づいているわけではありません。幸いなことに、グレゴリオ暦yearは一般に知られており、異なる年を使用する人々にも受け入れられますが、月/日の命名法は無意味になる場合があります。移植性を高めるために、DDDがその年の日であるYYYYDDDの形式は、より移植性があります。ただし、グレゴリオ暦を使用する私たちにとっては、thatは一般的に年の日付を知らないため、困難です。 MMDD形式は、たとえそれが20221442(グレゴリオ暦の年と月日)または20220047(グレゴリオ暦の2月16日、47日目)のような日付を作成する可能性がある個人にとって意味がない場合でも、ソート可能です。あなたのフォーマットに準拠しています。

フォーマットの普及をテーマに、世界中のキャラクターに配慮する必要があります。短いダッシュ「-」はマイナス記号なので、どこでも使用できます(?)。これはグローバルに使用されます。アンダースコアは、ラテンアルファベットを使用する一部のユーザーにとってさえ、さらに問題になります。彼らは通常何らかの方法でそれに到達できますが、すべてのキーボードにあるわけではありません。一部のアルファベットでは、アンダースコアが文字または文字修飾子であるため、混乱を招きます。多くのペルシア語では、アンダースコアはカシェダと解釈されます。私たちが下線を使用している多くのアルファベットでは、彼らは上線を使用します:私たちのキーボードでは難しいものです。技術者向けのキーボードのほとんどは、シンプルなラテンアルファベットが利用できるため(キーの横にある場合もあります)、文字を入力できます。ただし、常にアンダースコアとは限りません。

0
Douglas Milnes