web-dev-qa-db-ja.com

ファイル名にスペースは使用できませんか?

UnixとLinuxでは一般に、ファイルのファイル名(通常のファイル、ディレクトリ、リンク、デバイスファイルなど)にスペースを含めないようにする必要があると言われています。

しかし、私はいつもそうしています。内部にスペースがあるファイル名の場合、

  • Nautilusでは、スペース文字はスペースとして表示されます。
  • Bashターミナルでは、\を使用してスペースを表すか、ファイル名を二重引用符で囲みます。
  • 一部のアプリケーションのファイル(Nautilus、OSもそうするかどうかは不明)では、ファイル名は%20で置き換えられたスペースで書き込まれます。

ファイル名にスペースは本当に許可されていませんか?

ファイル名のスペースをどのように使用または処理しますか?

32
Tim

ファイル名では、スペース、および実際には/とNULを除くすべての文字を使用できます。ファイル名にnotスペースを使用することを推奨するのは、サポートが不十分なソフトウェアによって誤解される危険性があるためです。間違いなく、そのようなソフトウェアにはバグがあります。しかし、間違いなく、シェルスクリプトのようなプログラミング言語では、スペースを含むファイル名を提示すると壊れるソフトウェアを作成するのが非常に簡単になり、スペースを含むファイル名を使用する開発者がシェルスクリプトをテストしないことが多いため、これらのバグはすり抜ける傾向があります。それら。

%20で置き換えられたスペースは、ファイル名ではあまり見られません。これは主に(Web)URLに使用されます。 URLからの%エンコーディングが、しばしば偶然にファイル名に組み込まれることは事実ですが。

49
Celada

スペースareご覧のとおり、ファイル名に使用できます。

wikipediaのこのチャート の「most UNIX filesystems」エントリを見ると、次のことがわかります。

  • 任意の8ビット文字セットが許可されます。これはさまざまな8ビットセットのサブセットであり、常に8ビットバイトを使用して実装されるので、この傘の下でも7ビットASCIIと見なすことができます。

  • 禁止されている文字は/および "null"のみです。 「ヌル」はゼロバイトを指しますが、これらはいずれにしてもテキストデータでは許可されていません。

ただし、シェルを使用すると、面倒な、最も重要な*を作成するいくつかの文字があることに気付くでしょう。 、これはPOSIXグロビング演算子です。

「やりやすさ」の定義方法に応じて、couldに空白(スペース、タブ、改行など)を含めます。これにより、""で引用する必要が生じるためです。しかし、スペースが許可されているので、これは避けられません...

ファイル名のスペースをどのように使用または処理しますか?

シェル/コマンドラインコンテキストでは、ファイル名を一重引用符または二重引用符で囲みます(ただし、 これらは同じではありません WRTその他の問題に注意してください)。または、スペースを\でエスケープしてください。例:

> foo my\ file\ with\ spaces\ in\ the\ name
17
goldilocks

その理由は主に歴史的です-時空間の霧の中で戻ることはファイル名で許可されていなかったので、スペースはキーワード/ファイル名の区切り文字として使用されました。将来のシェルインタープリターは古いスクリプトとの互換性がなければならず、今日の頭痛の種に悩まされています。

人間にあまり対処する必要のないプロセスの開発者は、スペースを完全に削除することで、物事をはるかに簡単にすることができます。 Appleはこれを行い、/ System/Library/CoreServices /のコンテンツに含まれるスペースはごくわずかです。スペースを含むプログラムはユーザーに代わって開かれます。WouldLookStrangeIfCamelCased。同様のUNIX専用パスでもスペースを避けます。

(やや関連する逸話:90年代半ばに、Windowsドローンは「Macでできることの1つにWindowsではできないことを挙げてください」->「ファイル名に12文字を使用する。」->沈黙。スペースはこれらの12文字でも可能)

3
paul

そのため、他の場所で何度も述べられているように、ファイル名にはほとんどすべての文字を含めることができます。 filenamenotファイルであると言う必要があります。 attribute通常はファイル名がopenファイルに必要ですが、-ファイル名のみポイント実際のファイルに。これは、それを記録したディレクトリに保存されているリンクであり、inode番号-実際のファイルに非常に近似しています。

ですから、好きなように呼んでください。カーネルは関係ありません-カーネルが処理するすべてのファイル参照は、とにかく実際のiノード番号を扱います。ファイル名はhum​​an消費のためのものです-あなたがそれをクレイジーなものにしたいなら、まあ、それはあなたのファイルシステムです。ここでは、クレイジーなことをいくつか行います。

まず、20個のファイルを作成し、スペースのみを付けて名前を付けます。各ファイル名には、最後のスペースよりも1つ多いスペースが含まれています。

until [ $((i=$i+1)) -gt 20 ]
do  v=$v' ' && touch ./"$v"
done

これはちょっとおかしいです。私のlsを見てください:

ls -d ./*
./      ./          ./              ./                  ./                 
./      ./          ./              ./                  ./                  
./      ./          ./              ./                  ./                   
./      ./          ./              ./                  ./     

次に、このディレクトリをミラーリングします。

set -- * ; mkdir ../mirror
ls -i1qdU -- "$@" |
sh -c 'while read inum na
    do  ln -T "$1" ../mirror/$inum
    shift ; done' -- "$@"
ls -d ../mirror/*

../mirror/の内容は次のとおりです。

../mirror/423759  ../mirror/423764  ../mirror/423769  ../mirror/423774
../mirror/423760  ../mirror/423765  ../mirror/423770  ../mirror/423775
../mirror/423761  ../mirror/423766  ../mirror/423771  ../mirror/423776
../mirror/423762  ../mirror/423767  ../mirror/423772  ../mirror/423777
../mirror/423763  ../mirror/423768  ../mirror/423773  ../mirror/423778

わかりましたが、多分あなたは尋ねています-しかしそれは何が良いのですか?どちらがどれであるかをどのようにして確認できますか?どのようにすれば、正しいiノード番号を正しいファイル名に確実にリンクできますか?

上手...

echo "heyhey" >>./'    ' 
tgt=$(ls -id ./'    ')
cat ../mirror/${tgt%% .*} \
    $(ls -1td ../mirror/* | head -n1) 

出力

heyhey
heyhey

../mirror/"${tgt%% .*}"に含まれるiノード番号と./' 'によって参照されるiノード番号の両方が同じファイルを参照していることを確認してください。それらは同じファイルを記述します。彼らはそれを名付けたが、それ以上は何もない。不思議なことはありませんが、実際には不便な点がいくつかありますが、最終的にはunixファイルシステムの操作にほとんど影響を与えません。

2
mikeserv