Linux でファイル名に含まれるスペースを処理する方法

Linux でファイル名に含まれるスペースを処理する方法

重要なポイント

Linux システム上でファイル名にスペースが含まれている場合、ファイル名を引用符で囲むと、Bash がファイル名を正しく処理できるようになります。タブ補完を使用すると、スペースが含まれている場合でも、コマンド ラインでファイル名を簡単に入力できます。

ほとんどのオペレーティング システムと同様に、Linux はスペースを含むファイル名をサポートします。ただし、コマンド ラインでこれらのファイル名を使用するのは必ずしも簡単ではありません。スペースを含むファイル名を処理する方法をいくつか紹介します。

Linux のファイル名はどのように機能するのでしょうか?

コンピュータのハードドライブに保存されているものにはすべて名前が必要です。名前がなければ、ファイルは存在しません。コンピュータの起動時に起動されるすべてのアプリケーションとデーモン、および使用するすべてのソフトウェアは、識別されてファイル システムに保存される必要があります。その識別情報がファイルの名前です。

同じことが、作成またはインストールするファイルにも当てはまります。すべてのドキュメント、画像、音楽にはファイル名が必要です。ファイル名がなければ、デジタル資産は存在できません。ファイル名は非常に重要であるため、Linux はファイルの構成に関するルールをできる限り少なくするよう努めています。

Linux では、ファイル名にはスラッシュ「/」とヌル文字 0x00 を除く任意の文字を含めることができます。null 文字は文字列の終わりをマークするために使用されるため、文字列自体に null 文字を含めることはできません。そうしないと、Linux は null 文字の位置でファイル名を切り捨てます。「/」スラッシュはディレクトリ パスの区切り文字として使用されます。

ファイル名は大文字と小文字が区別され、ヌル文字を含めて最大 255 バイトの長さにすることができます。ディレクトリ パスの長さは、ヌル文字を含めて最大 4096 バイトです。これはバイト単位の長さであり、文字と直接同じではない可能性があることに注意してください。たとえば、16 ビット Unicode 文字はそれぞれ 2 バイト必要です。

レトロ コンピューティングの愛好家や長い思い出を持つ人は、パーソナル コンピュータの初期の頃、Microsoft のディスク オペレーティング システム(DOS) が大文字と小文字を区別せず、ファイル名に 8 文字と 3 文字の拡張子という制限があったことを知っているでしょう。

ファイルに名前を付けるときは、非常に慎重に、時には創造的にする必要がありました。それに比べて、今日私たちが持っている自由は、ファイルに対して作成する説明以外はほとんど考えずに、好きなようにファイルに名前を付けることができることを意味します。

しかし、ファイル名に関して最もつまずくのは、入力する文字ではなく、文字間のスペースです。

Linux ファイル名のスペースが厄介な理由

Bash などのシェルは、スペースで区切られた単語の文字列を、単一の引数ではなく個別のコマンド引数として解釈します。以下に、「my new file.txt」という名前の新しいファイルを作成するtouch例を示します。

touch my new file.txt ls

タッチを使用して名前にスペースを含むファイルを作成しようとしています

ご覧のとおり、lsは 3 つのファイルが作成されていることを示しています。1 つは「my」、もう 1 つは「new」、そしてもう 1 つは「file.txt」です。

touch文句を言ったりエラーをスローしたりしなかったことに注意してください。私たちが求めていると考えていることを実行します。したがって、黙ってコマンドラインに戻ります。確認する意欲がなければ、物事が計画通りに進んでいないことに気づきません。

必要なファイルを作成するには、引用符を付けるかエスケープする必要があります。

スペースを引用およびエスケープする方法

ファイル名全体を引用した場合、touchは引用されたテキストを単一の引数として扱う必要があることを認識します。

touch 'my new file.txt' ls

touch を使用して、ファイル名全体を引用符で囲み、名前にスペースを含むファイルを作成する

今度は、期待した単一のファイルを取得します。

\バックスラッシュ文字「 」を使用してスペースをエスケープしても、同じ結果が得られます。スペースを「エスケープ」すると、スペースは特殊文字 (つまり引数の区切り文字) として扱われなくなり、普通の古いスペースとみなされます。

touch my\ second\ new\ file.txt ls

タッチを使用して、名前にスペースをバックスラッシュでエスケープしたファイルを作成する

これは機能しますが、スペースをエスケープするとファイル名の入力が遅くなり、エラーが発生しやすくなります。ディレクトリ名にスペースが含まれていると、状況が非常に醜くなる可能性があります。

cp dir one/my\ text\ file.txt dir\ two/my\ text file.bak ls

コマンドでエスケープされたスペースを使用して、あるディレクトリから別のディレクトリにファイルをコピーする

このコマンドは、単一のテキスト ファイルを「dir 1」というディレクトリから「dir 2」というディレクトリにコピーし、そのコピーを BAK ファイルとして保存します。そして、これは非常に単純な例です。

スペース問題を根本から解決する方法

自分のファイルの場合は、スペースを決して使用しないというポリシーを決定し、次のようにファイル名を作成 (または一括名前変更) することができます。

mynewtextfile.txt

確かに、これは強力なソリューションですが、まだ醜いです。-ダッシュ ” ” やアンダースコア ” _” を使用して単語を区切るなど、より良いオプションがあります。

my-new-text-file.txt my_new_text_file.txt

これらは両方とも問題を回避し、読みやすいものです。ファイル名に余分な文字を追加したくない場合は、次のようにCamelCaseを使用してファイル名を読みやすくすることができます。

MyNewTextFile.txt

タブの展開によりスペースの処理が簡単になります

もちろん、命名規則を採用し、それを遵守することは、独自のファイルを扱う場合にのみ役に立ちます。他の場所から来たファイルは、採用されている命名規則に従っていない可能性があります。

タブ展開を使用すると、ファイル名を正確に「入力」することができます。を使用して、「dir two」で作成した BAK ファイルを削除したいとしますrm

rmコマンドを使用しており、ディレクトリ名が「dir」で始まることがわかっているため、まず「rm dir」と入力します。

rm dir

タブ補完を使用するためにタブを押す前に、コマンドの開始を入力する

「Tab」キーを押すと、Bash が現在のディレクトリ内で一致するものをスキャンします。

タブを押すと、部分的なディレクトリ パスにバックスラッシュとスペースが追加されました

「dir」で始まるディレクトリが 2 つあり、どちらの場合も次の文字はスペースです。したがって、Bash はバックスラッシュ文字「\」とスペースを追加します。その後、Bash は次の文字が提供されるのを待ちます。このディレクトリ内で一致する可能性のある 2 つの文字を区別するには、次の文字が必要です。

「two」を表す「t」を入力し、もう一度「Tab」を押します。

入力後のディレクトリパス

Bash はディレクトリ名を入力し、ファイル名の先頭が入力されるのを待ちます。

このディレクトリにはファイルが 1 つしかないため、ファイル名の最初の文字「m」を入力するだけで、どのファイルを使用するかを Bash に知らせることができます。「m」を入力して「Tab」を押すとファイル名が完成し、「Enter」を押すとコマンド全体が実行されます。

を押すとファイル名全体が完成します

タブを展開すると、ファイル名が正しいかどうかを簡単に確認できるほか、一般にコマンド ラインでの移動や入力も高速化されます。

Bash スクリプトでスペースを含むファイル名を使用する方法

ファイル名のスペースに関して、コマンド ラインとまったく同じ問題がスクリプトでも発生するのは当然のことです。ファイル名を変数として渡す場合は、必ず変数名を引用符で囲んでください。

この小さなスクリプトは、現在のディレクトリでファイル パターン「*.txt」に一致するファイルをチェックし、それらのファイルを という変数に保存しますfile_listfor ループは、それぞれに対して単純なアクションを実行するために使用されます。

#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedone

このテキストをエディタにコピーし、「files.sh」という名前のファイルに保存します。次に、chmod コマンドを使用して実行可能にします。

chmod +x files.sh

chmod を使用してスクリプトを実行可能にする

このディレクトリにはいくつかのファイルがあります。1 つは単純なファイル名で、他の 2 つはスペースの代わりにアンダースコア ” _” またはダッシュ ” ” を使用しています。-これは、スクリプトを実行すると表示されるものです。

./files.sh

スペースを含まないファイル名を使用して files.sh スクリプトを実行する

それはうまくいくようです。ただし、名前にスペースが含まれるファイルのディレクトリ内のファイルを変更してみましょう。

./files.sh

スペースを含むファイル名を使用して files.sh スクリプトを実行する

各ファイル名のすべての単語は、それ自体がファイル名であるかのように処理されるため、スクリプトは失敗します。ただし、スクリプトでファイル名のスペースを処理するために必要なのは、ループ$file内で変数を引用符で囲むことだけですfor

#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"done

ドル記号「$」が引用符の中にあることに注意してください。この変更を加えて「files.sh」スクリプト ファイルに保存しました。今回は、ファイル名が正しく処理されます。

./files.sh

変更された files.sh スクリプトは、ファイル名にスペースが含まれるファイルを正しく処理します。

間隔はあるが不安定ではない

自分のファイル名にスペースを使用しないようにしても、それだけでは限界があります。他のソースからの名前にスペースが含まれるファイルに遭遇することは避けられません。ありがたいことに、これらのファイルをコマンド ラインまたはスクリプトで処理する必要がある場合は、簡単な方法があります。

Linuxコマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · パッチ · 変換 · rclone · シュレッド · srm · scp · gzip · chattr · カット · 検索 · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · グループ · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワード · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping traceroute ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です