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


48

現在、私は YYMMDD-NAME+PAGE 私のファイルのほとんどの名前。 NAME スペースをアンダースコアに変換します。

使用したい YYYY-MM-DD 日付の形式、しかし私は名前からそれを分離する方法がわからない。 A - 名前が数字で始まっていると奇妙に見えるでしょう。私が使用する場合 _その後、スペースを表すアンダースコアと競合します。

ここで機能するファイル名には、どの文字がかなり安全ですか?私はLinuxを使っていますが、他の人とファイルを共有することがあります(Windows 7、Mac OS X)。


…Unix、Windows、Amiga 1000?
slhck

最近のほとんどのLinux。
Martin Ueding

- シンボルはWindows 7で安全に使用できます。他の最新のオペレーティングシステムでも同様です。マイナス記号を使用して分離することもできます。
Niranjan Singh

クロスサイトで複製される可能性があります。 stackoverflow.com/questions/4814040/…
Ciro Santilli 新疆改造中心 六四事件 法轮功

回答:


41

概要:

  • Windows:ASCIIの制御文字以外のもの \/:*?"<>|
  • Linux、OS-X:nullまたはnull以外のもの /

すべてのプラットフォームで、ASCII制御文字などの印刷不能文字を避けることが最善です。

Windows

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

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

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 commandは代わりにAbの内容を返すだけです。 3番目のファイルもLinux上のaBとは異なるでしょう。

(Windows 10 NTFS)


1
結局のところ良い答えですが、私はスペースの中でファイル名を使うのを控えたいと思います。すべての文脈でそれらを適切にエスケープすることは、それが価値がある以上に面倒です。 Microsoftがシステムディレクトリ名にスペースを使うのをやめたことに注意してください。単語の境界を名前で示す必要がある場合は、CamelCaseは正常に機能します。
Isaac Rabinovitch

3
"C:\ Program files(x86)"はWin8にまだ存在します - それはシステムディレクトリではないですか?スペースが問題を引き起こす可能性があることに同意します。
RedGrittyBrick

それはそうです、しかしそれはほとんど何でもに名前を変更することができます。もちろん、名前を "]:\ foobar"に変更すると、多くのプログラムで異常が発生しますが、Windowsはいずれにせよ "%programfiles(x86)%"と呼びます。
Marcks Thomas

2
ここで本当に頭に入れておくべきこととして、Linuxシステムは大文字と小文字を区別することができますが、Windowsはそれらを同じと見なします。
thecoshman

1
あなたは、多くのプログラムが構文解析をしゃぶっているのに驚かれるでしょう。だからこそ、Windows 9はありませんでした。
Isaac Rabinovitch

38

RedGrittyBrickの答えは技術的には正しいですが、安全性だけが問題ではありません。ユーザビリティも重要です。私はもっ​​と良い質問が "どの文字がファイル名に使うのに適しているか"であると思う。

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

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

それは基本的にあなたを残します:

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

それは 常に 安全で使いにくくありません(英数字でファイル名を始める限り):)


1
中かっこ( [] )は正規表現の一部であり、シェルにおいても特別な意味を持ちます。しかし、いくつかの悪いコーナーケースを除いて、それらはそれほどうまく機能しません。
Martin Ueding

1
Hrm ...私は同じことが言えると思います ()、実際には。
naught101

4
zshでは、解釈が異なる可能性のある文字には []()^;正しい答えは実際には [0-9a-zA-Z.,_-] ファイル名で見るのが奇妙だというだけで、コンマも除外される可能性がありますが、実際に問題が発生することは考えられません。
Casey Rodarmor

ええ、私は最終的なリストからそれらを削除しました
naught101

1
カンマは迷惑になることがあります、試してみてください echo whereami > a,b,c Win10のコマンドプロンプトウィンドウで。
RedGrittyBrick

4

あなたは出来る:

  1. 現在のアンダースコアを # (スペースの校正者のシンボル)
  2. ファイル名から「セクション」の日付までのアンダースコア(または2番目のハイフン - 入力しやすい)

Alt-1イニシャルキャップはスペースを置き換えることができます。 YYMMDD-HHMM-FileName.ext または YYMMDD-HHMM_FileName.ext

明確な表示のための最小文字数。1月から9月まではゼロが埋め込まれて自動ソートされます(1日から9日まで)。

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