Linuxでファイル名のスペースを扱う方法
重要なポイント
Linuxシステム上でスペースを含むファイル名がある場合、ファイル名を引用符で囲むことでBashが正しく処理します。タブ補完を使用すると、スペースを含んでいてもコマンドラインでファイル名を簡単に入力できます。
ほとんどのオペレーティングシステムと同様に、Linuxもスペースを含むファイル名をサポートしています。しかし、コマンドラインでこれらのファイル名を使用することは必ずしも簡単ではありません。スペースを含むファイル名を扱ういくつかの方法をここに示します。
Linuxのファイル名はどのように機能しますか?
あなたのコンピュータのハードドライブに保存されているすべてのものには名前が必要です。名前がなければ、ファイルは存在しません。あなたのコンピュータが起動する時に起動するすべてのアプリケーションやデーモン、そしてあなたが使用するすべてのソフトウェアは、識別され、ファイルシステムに保存される必要があります。その識別はファイルの名前です。
あなたが作成またはインストールするファイルにも同じことが当てはまります。すべての文書、画像、音楽にはファイル名が必要です。ファイル名がなければ、あなたのデジタル資産は存在できません。ファイル名が非常に重要であるため、Linuxはそれらの構成に関して可能な限り少ないルールを課そうと努力しています。
Linuxでは、ファイル名にはスラッシュ「/」とヌル文字0x00以外の任意の文字を含めることができます。ヌル文字は文字列の終わりを示すために使用されるため、文字列自体に含めることはできません。そうしないと、Linuxはヌル文字の位置でファイル名を切り捨ててしまいます。「/」スラッシュは、ディレクトリパスのセパレーターとして使用されます。
ファイル名は大文字と小文字を区別し、ヌル文字を含めて最大255バイトの長さである必要があります。ディレクトリパスは、ヌル文字を含めて最大4096バイトの長さであることができます。これはバイトでの長さであり、文字数とは直接的に一致しない場合があることに注意してください。例えば、16ビットUnicode文字は各2バイトを取ります。
レトロコンピューティング愛好者や長い記憶を持つ人々は、初期のパーソナルコンピュータの時代に、マイクロソフトのディスクオペレーティングシステム(DOS)が大文字小文字を区別せず、ファイル名が8文字、さらに3文字の拡張子に制限されていたことを知っているでしょう。
ファイルに名前を付ける際には、とても思慮深く、時には創造的でなければなりませんでした。それに対して、今日の私たちの自由は、ファイルをその内容の説明以外のことにほとんど考慮せず、好きなように名前を付けることができることを意味しています。
しかし、ファイル名において、私たちを最も悩ませるのは、入力する文字ではなく、それらの間のスペースです。
Linuxのファイル名におけるスペースの問題
Bashのようなシェルは、空白で区切られた単語の文字列を個別のコマンド引数として解釈し、単一の引数とは見なしません。以下は、touchを使用して「my new file.txt」という新しいファイルを作成する例です。
touch my new file.txtlsご覧のとおり、lsは「my」という名前のファイル、もう一つの「new」という名前のファイル、そして「file.txt」という名前のファイルが3つ作成されていることを示しています。
touchは文句を言ったりエラーを投げたりしないことに注意してください。それは私たちが求めていると思うことを実行します。ですので、何も言わずに私たちをコマンドラインに戻します。もし私たちが確認する気にならなければ、物事が計画通りに進んでいないことに気づかないでしょう。
作りたいファイルを作るためには、引用符を使うかエスケープする必要があります。
引用とスペースのエスケープ方法
ファイル名全体を引用すれば、touchは引用されたテキストを一つの引数として扱う必要があることを知っています。
touch 'my new file.txt'ls今回は期待していた単一のファイルを取得します。
バックスラッシュ文字 "\" を使用してスペースをエスケープすれば、同じ結果を得ることができます。スペースを「エスケープ」することで、それらは特別な文字、つまり引数の区切りとして扱われず、ただのスペースと見なされます。
touch my\ second\ new\ file.txtlsそれは機能しますが、スペースをエスケープすることでファイル名の入力が遅くなり、エラーが発生しやすくなります。スペースを含むディレクトリ名があると、事態は本当に厄介になる可能性があります。
cp dir one/my\ text\ file.txt dir\ two/my\ text file.baklsそのコマンドは、「dir one」というディレクトリから「dir two」というディレクトリに1つのテキストファイルをコピーし、コピーをBAKファイルとして保存します。そして、これはかなりシンプルな例です。
その根本からスペースの問題を解決する方法
もしそれがあなた自身のファイルであれば、スペースを使わないというポリシーを決定し、このようなファイル名を作成(または一括で名前を変更)することができます。
mynewtextfile.txt確かに、それは堅牢な解決策ですが、まだ見栄えが悪いです。言葉を区切るために、ダッシュ「-」やアンダースコア「_」を使うなど、より良い選択肢があります。
my-new-text-file.txtmy_new_text_file.txt
これらの両方は問題を回避し、読みやすくなります。ファイル名に余分な文字を追加したくない場合は、CamelCaseを使用してファイル名を読みやすくすることができます。例えば、次のようになります:
MyNewTextFile.txtタブの拡張はスペースの処理を簡単にします
もちろん、自分のファイルを扱うときに命名規則を採用し、それに従うことは役立ちます。しかし、他の場所から来たファイルは、あなたが採用した命名規則に従う可能性は低いです。
タブ展開を使用して、私たちのためにファイル名を正確に「入力」することができます。例えば、「dir two」で作成したBAKファイルを削除したい場合は、rmを使用します。
まず「rm dir」と入力します。なぜなら、rmコマンドを使用していて、ディレクトリ名が「dir.」で始まることが分かっているからです。
rm dir「Tab」キーを押すと、Bashは現在のディレクトリで一致するものをスキャンします。
「dir」で始まる2つのディレクトリがあり、どちらの場合も次の文字はスペースです。そこでBashはバックスラッシュ「\」とスペースを追加します。その後、次の文字を入力するのを待ちます。この次の文字が必要なのは、このディレクトリ内の2つの可能な一致を区別するためです。
「二」を表す「t」を入力し、さらにもう一度「Tab」を押します。
Bashは私たちのためにディレクトリ名を補完し、ファイル名の最初の部分を入力するのを待っています。
このディレクトリには1つのファイルしかないので、ファイル名の最初の文字「m」を入力するだけで、Bashはどのファイルを使用したいかを知ることができます。「m」を入力して「Tab」を押すと、ファイル名が自動的に補完され、「Enter」を押すとコマンド全体が実行されます。
タブ拡張はファイル名を正しく取得するのを容易にし、一般的にコマンドラインでのナビゲートや入力を速くします。
Bashスクリプトでスペースを含むファイル名を使用する方法
スクリプトがコマンドラインと同じく、ファイル名にスペースが含まれることに関して全く同じ問題を持っているのは驚くことではありません。ファイル名を変数として渡す場合は、変数名を引用符で囲むことを確認してください。
この小さなスクリプトは、現在のディレクトリ内で「*.txt」というファイルパターンに一致するファイルをチェックし、それらをfile_listという変数に格納します。forループを使用して、それぞれに対して簡単なアクションを実行します。
#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedoneこのテキストをエディタにコピーして、「files.sh」という名前のファイルに保存します。次に、chmodコマンドを使用して実行可能にします。
chmod +x files.shこのディレクトリにはいくつかのファイルがあります。一つはシンプルなファイル名で、他の二つはスペースの代わりにアンダースコア「_」またはダッシュ「-」を使用しています。これがスクリプトを実行したときに見るものです。
./files.shそれはうまくいきそうですね。しかし、ディレクトリ内のファイルを名前にスペースを含むファイルに変更しましょう。
./files.sh各ファイル名のすべての単語は、それ自体がファイル名であるかのように扱われ、そのためスクリプトは失敗します。しかし、スクリプトがファイル名内のスペースを処理するために必要なのは、$file変数をforループ内で引用符で囲むことだけです。
#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"doneドル記号「$」は引用符の中にあることに注意してください。私たちはその変更を行い、"files.sh"スクリプトファイルに保存しました。今回は、ファイル名が正しく処理されます。
./files.shスペースアウトしているが、フレークではない
自分のファイル名にスペースを避けることはある程度までしか効果がありません。他のソースからの名前にスペースが含まれるファイルに遭遇するのは避けられないことです。幸いなことに、コマンドラインやスクリプトでそれらのファイルを扱う必要がある場合、簡単に対処する方法があります。
Linuxコマンド | ||
ファイル | t | |
プロセス | A | |
ネットワーキング | netstat・ping・traceroute・ip・ss・whois・fail2ban・bmon・dig・finger・nmap・ftp・curl・wget・who・whoami・w・iptables・ssh-keygen・ufw・arping・firewalld |












