シェルのワイルドカードを使いこなそう

リラックス!Linux!

Raspberry Pi(ラズパイ)やUbuntuを使っていると、コマンドを自在に操れれば…と感じている方もいるのではないでしょうか?
LinuxのUbuntu等で「端末からコマンドを実行する」ことを実現しているのが「シェル」です。このシェルにはコマンドを自在に操るのに便利な機能が装備されています。
今回はワイルドカード等によるファイル名の展開を紹介します。

端末を起動しよう

本稿ではUbuntu 24.04(ベータ)を使って説明します。
Ubuntuを起動すると、下のような画面が表示されるでしょう。

ここで、[Ctrl]+[Alt]+[T](3つのキーを同時に押す)を入力してみてください。

上図のように端末が起動されます。

ワイルドカード “*”

ls コマンドを実行してください。ファイルやディレクトリが一覧で表示されます。
次に以下のコマンドを実行してみてください。

echo *
図1

ls コマンドの実行結果と同じ結果が表示されました。ただし、文字の色や表示の順序、フォーマットが微妙に違います。
ここで、echo とは、オプション(引数)で与えられた文字列を書き出すコマンドです。例えば、「Hello world!」と表示したければ次のように実行します。

上の図1の場合、* という文字が与えられています。シェルで * という文字は「任意の0文字以上の文字列を持つファイルやディレクトリ名(ファイル名という)を探す」ことを意味します。シェルはコマンド入力の中に * があると、* をファイル名に置き換えようとします。ファイルやディレクトリが存在すると、必ずその名称は1文字以上の文字列です。なので、シェルは * をカレントディレクトリのファイル名に置き換えます。そのうえで、echoコマンドに左記のファイル名をオプションとして指定し、実行します。ファイルやディレクトリが複数ある場合は、それらがそのまま全部 echo に渡されます(厳密には例外がありますが、ここでは触れません)。
上の例では、ホームディレクトリで echo * と入力していますが、次のように起動するのと同じ結果になります。

echo snap worx ダウンロード テンプレート デスクトップ ドキュメント ビデオ ピクチャ ミュージック 公開

この * のようなシェルにとっての特殊なキャラクタはメタキャラクタ(ワイルドカード)と呼ばれています。

任意の1文字を表す”?”

以下をコピペして実行ください。

mkdir -p worx/file
cd !$
for i in $(seq 20)
do
touch file_$i
done
ls

実行結果は以下のようになるでしょう。

上記の実行結果、末尾が数字1~20の名称を持つファイルが20個作成されました。

以下のコマンドを実行してみてください。

ls file_?

“?”は任意の1文字を表すメタキャラクタです。ファイル名”file_”の後に1文字で終わるファイル名とマッチします。数字が2文字あるファイル名とはマッチしません。下は実行結果です。

次に下のコマンドを実行してみてください。

ls file_??

“?”一つは1文字とマッチするので、”?”二つだと、数字の部分が二けたになっているファイル名のみマッチします。逆に、数字が一桁のファイル名にはマッチしません。

“*”と併せて”?”を使えるようになっていると非常に便利です。

候補文字とマッチできる[ ]

以下のコマンドを実行してみてください。

ls file_[123]
[ ]は、かっこの中の任意の1文字とマッチします。すると、上図の3つのファイルのみとなります。
ここで、[123]は[1-3]と記述することができます。

[ ]では、否定(Not)を記述できます。[ ]内の先頭に^を指定します。
たとえば、[^123]と指定すると結果は以下のようになります。

ls [^123]

なお、[ ]内は数字だけではなく、アルファベットも指定可能です。

以下を実行すると、ファイル名の末尾が a から c のファイルが作成されます。

for i in a b c
do
touch file_$i
done

ファイルの末尾がアルファベットのものをlsコマンドで表示するには、次のように実行します。

上記の結果から、file_bを除くためには、いくつか方法がありますが、一例を示します。

おわりに

これまでのメタキャラクタをおさらいしましょう。

*0文字以上の任意の文字列とマッチする
?任意の1文字とマッチする
[ …]カッコ内のいずれか1文字とマッチする
[^…]「カッコ内の文字のいずれにも一致しないもの」にマッチする