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

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

重要なポイント

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

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

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

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

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

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

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

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

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

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

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

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

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

新しいファイル.txt に触れてください

ls

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

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

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

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

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

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

 「新しいファイル.txt」をタッチします

ls

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

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

私の\ 2番目の\ 新しい\ file.txtにタッチしてください

ls

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

 cp dir 1/my\ text\ file.txt dir\ two/my\ text file.bak

 ls

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

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

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

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

私の新しいテキストファイル.txt

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

私の新しいテキストファイル.txt

私の新しいテキストファイル.txt

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

 MyNewTextFile.txt 

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

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

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

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

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

 rmディレクトリ

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

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

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

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

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

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

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

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

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

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

 #!/bin/bashfile_list=*.txt$file_listdo ls -hl $filedone のファイル

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

 chmod +x ファイル.sh

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

 ./files.sh

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

 ./files.sh

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

 #!/bin/bashfile_list=*.txt $file_listdols のファイル -hl "$file"done

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

 ./files.sh 

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

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

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

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 ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

「 Linux でファイル名に含まれるスペースを処理する方法」に関するベスト動画選定!

Linux基本コマンドを使いこなそう(ファイル操作/テキスト処理)
【Linux入門】初心者向け!Linuxの基本的なコマンド操作を学ぼう!  〜 Ubuntu 環境で実演〜