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


31

一般に、UnixおよびLinuxでは、ファイル(通常のファイル、dir、リンク、デバイスファイルなど)のファイル名にスペースを含めることは避けてください。

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

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

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

ファイル名のスペースを正しく使用または処理するにはどうすればよいですか?


17
それは許可されていますが、本当に、本当に迷惑です。理由はありません。しないでください。
モニカとの軽さのレース14

3
-rf ~(use touch -- "-rf ~")という名前のファイルを作成することもできますが、お勧めしません。
イアンD.スコット14

5
「cd」と呼ばれる自己破壊スクリプトを作成するなど、許可されていますが、実行しないでください。ファイルは3つの異なるツールですでに異なって見えますが、それだけでは十分ではありませんか?
ファルコ14

7
誰もが本当に、本当に迷惑だという意見を共有しているわけではありません。また、「理由はありません」は明らかに偽りであるため、反論する必要はありません。私は何年も前にきちんとスペースを処理する方法を学びましたが、大部分は本当に大したことではありません。

2
@snailboat Spacesは、標準化の欠如である実際の問題の症状です。Unixファイルシステムでは、ファイルの「名前」をほぼ無制限のバイナリBLOBにできます。不正なバイトは0と47(/区切り文字)のみです。残りの254バイトすべてを使用すると、口に出せない不思議な「名前」のすべての方法への扉が開かれます。明らかにこれは正気ではありませんが、誰もが「正気」とは何かに同意しているわけではなく、異なるキャラクターが異なるツールを破壊します。皆の正気の交差点は非常に小さいです。
jw013 14

回答:


48

/ファイル名にはスペース、および実際にはNUL を除くすべての文字を使用できます。ファイル名にスペースを使用しないことを推奨するの、スペースを十分にサポートしていないソフトウェアによってスペースが誤って解釈される可能性があるためです。おそらく、そのようなソフトウェアにはバグがあります。しかし、間違いなく、シェルスクリプトのようなプログラミング言語では、スペースを含むファイル名が表示されると破損するソフトウェアを簡単に作成できます。シェルスクリプトは、スペースのあるファイル名を使用してそれら。

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


6
それは「URLエンコーディング」または「パーセントエンコーディング」です 。en.wikipedia.org / wiki / URL_encodingによると、おそらく最も適切な名前はおそらく「URIエンコーディング」ですが、人々はurlをURIよりも簡単に言うので、これは一般的な形式です誤称。URIの予約文字セットは、* nixファイル名よりも大きいことに注意してください。
ゴルディロックス

1
@Timのコマンドライン引数でNUL文字を指定できることはわかりませんbash。Ctrl-Vなどで引用するなど、いくつか試してみました$(echo -e \\0)が、うまくいきませんでした。NULがファイル名で使用できない理由は、(文字列ターミネーターであるため)C文字列で使用できないことと、Cプログラムで処理される実質的にすべての文字列と同様に、すべての基礎となるAPIがその形式を使用するためです。以来bashCで書かれて、それは単にそれらの中にNULを持つ任意の文字列の全くサポートしていないかもしれません。私は、間違っている可能性がいくつかのあいまいな方法があるかもしれません...
Celada

1
並べ替えはコンテキストに依存します。通常、文字列関数は最後のnullをカウントしません(または、最初のnullは文字列の末尾になりますが、その後に何かがあったとしても)、その意味では長さがゼロであり、したがって空と見なされます。
goldilocks 14

3
@Celadaはもちろん使用できNUL、bashが必要$'\0'です。例:find . -print0 | while read -d $'\0' f; do echo "$f"; done
terdon

1
@goldilocks人々は実際にURLを「url」と発音しますか?
マイルルーティング14

17

あなたが観察したように、ファイル名にスペース使用できます。

wikipediaのこのチャートの「ほとんどのUNIXファイルシステム」エントリを見ると、次のことがわかります。

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

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

ただし、シェルを使用する*と、POSIXのグロビング演算子である最も面倒な面倒な作業を引き起こすいくつかの文字があることに気付くかもしれません。

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

ファイル名のスペースを正しく使用または処理するにはどうすればよいですか?

シェル/コマンドラインコンテキストでは、ファイル名を一重引用符または二重引用符で囲みます(ただし WRTの他の問題と同じではないことに注意しください)\

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

1
bashでNUL文字をどのように指定しますか?ファイル名でテストしたい。
ティム14

1
できません。「実行セマンティクス」とは、C(および私が知っている他のすべての言語)で、テキスト文字列がnullで終了するという事実を指します。シェルは、私は考えることができsneakest事があるCで実装されるtouch $(echo -e "foo\00bar")- -eプロセス\0N8進数として、それはちょうどという名前のファイルを作成して、それはまだ、失われたどこかを取得しますfoobar。もちろん、NULLは印刷できませんが、C文字列の制限のため、そこからNULLが消えることを保証します。
goldilocks 14

「テキスト文字列はヌル文字で終了します」 ->さらに説明すると、文字列は常に最後にゼロバイトで格納されます。これがテキストで「許可されない」理由です。その時点で。例えば、ほとんどの意図と目的に関してfoo[NULL]barは最終的にはそうなるでしょうfooecho -eNULLが発生しないという事実は、どこかでNULLが削除されたことを示しています。
goldilocks 14

5
ほとんどのプログラミング言語では、文字列にヌル文字を使用できます。そうではない主な言語は、Unixが構築されているCであり、ほとんどのUnixシェルでは文字列にヌル文字も使用できません。いずれにせよ、@ Tim、すべてのUnixインターフェイスはヌルで終わる文字列を使用するため、ファイル名にヌルバイトを含めることはできません(さらに/、ディレクトリセパレーターであり、引用符で囲むことができないため、パス名に含めることができます)ファイル名には含まれません)。
ジル 'SO-悪であるのをやめる' 14

1
...しかし[二度と気にしない]。とにかく、あまり頻繁にやるようなことではありません。私の考えでは、それらがテキストデータに含まれる理由はありません。私はそれを訂正したでしょうが、それはコメントです。
goldilocks

3

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

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

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


1
V6 Unix(c。1978)を使用していました。その後、スペース許可れました。ファイルシステムを解析するプログラム(ダイレクトディスクI / Oを使用)を作成し、名前にスペースとバックスペースが含まれているファイルを探すことが、1つのタスクでした。
ウォリック14

スペースを完全に削除しますか?または、ファイル名にスペースがほとんど含まれていませんか?
mikeserv 14

2

そのため、他の場所で何度も述べられているように、ファイル名にはほぼすべての文字を含めることができます。しかし、ファイル名ファイルでないと言う必要があります。通常、ファイルを開くにはファイル名が必要ですが、ファイル名は実際のファイルを指しているだけなので、ファイル属性としてある程度の重みがあります。これは、iノード番号とともに、それを記録したディレクトリに保存されたリンクです。これは、実際のファイルにより近い近似です

だから、あなたが知っている、あなたが望むものは何でもそれを呼び出します。カーネルは気にしません-カーネルが処理するすべてのファイル参照は、とにかく実際のiノード番号を処理します。ファイル名は人間が消費 -クレイジーなものにしたいなら、それはあなたのファイルシステムです。ここで、私はいくつかのクレイジーなことをします:

最初に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

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

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