助け合いフォーラム

LinuC

LinuC Lv1-101(Ver10.0)
問題ID : 14947
問題を開く
ファイル名「xyz.txt」に一致するワイルドカードは次のうちどれか。(3つ選択)

正解

xy?.txt

[a-z][a-z][a-z].txt

*[xyz].txt

解説

シェルによって特別に解釈される文字をメタキャラクタといいます。

以下は主なメタキャラクタをまとめたものです。


このうち、「*」、「?」、「[ ]」など任意の文字を表す特殊文字がワイルドカードです。ファイル名などのパターンと照合する際にコマンドで使用できます。

例)「[a-z][a-z][a-z].txt」に一致するファイルを一覧表示する
$ ls [a-z][a-z][a-z].txt

選択肢を1つずつ確認します。

・a*z.txt
ファイル名がaから始まると解釈されるので表示されません。誤りです。

・xy?.txt
「xy(任意の1文字).txt」は「xyz.txt」に一致します。正しいワイルドカードです。

・[xyz].txt
「(xyzのいずれか1文字).txt」と解釈されるので表示されません。誤りです。

・[a-z][a-z][a-z].txt
aからzのいずれか1文字が3つということで「xyz.txt」に一致します。正しいワイルドカードです。

・*[xyz].txt
「(任意の文字列)(xyzのいずれか1文字).txt」で「xyz.txt」に一致します。正しいワイルドカードです。

したがって正解は
・xy?.txt
・[a-z][a-z][a-z].txt
・*[xyz].txt
です。

以下は実行例です。

参考

メタキャラクタは、シェルによって特別に解釈される文字です。

以下は主なメタキャラクタとディレクトリ関連の特殊記号をまとめたものです。


例えばechoコマンドの引数に「*」を指定した場合、シェルは「*」を表示せずカレントディレクトリの内容を表示します。これは、シェルが「*」をメタキャラクタとして特別に認識するためです。

$ echo *
file1 file2

シェルがメタキャラクタを通常の文字として扱う(メタキャラクタをエスケープする)ためには、以下のような方法があります。

・「\」(環境によっては「¥」が表示される)をメタキャラクタの直前に付ける

$ echo \*
*

・「'」でメタキャラクタまたはメタキャラクタを含む文字列を囲む

$ echo '*'
*

・「"」でメタキャラクタまたはメタキャラクタを含む文字列を囲む

$ echo "*"
*

なお、「"」で囲まれた「$」、「`」、「\」、「"」は文字ではなくメタキャラクタとして扱われます。

例)
$ DATE=date
$ echo "$DATE"
date

「"」で囲まれていても「$」はメタキャラクタとして扱われるため、「$DATE」とは表示されず、変数に格納されている値が表示されます。
つまり、「echo "$DATE"」と「echo $DATE」の実行結果は同じです。

例)
$ echo "`date`"
2012年 1月 12日 木曜日 15:00:40 MST

「"」で囲まれていても「`」はメタキャラクタとして扱われるため、「`date`」とは表示されず、dateコマンド(現在の日付と時刻を表示)の実行結果が表示されます。
つまり、「echo "`date`"」と「echo `date`」の実行結果は同じです。
上に戻る

*[xyz].txtが答えな理由が分かりません。

投稿日 2025/08/07

*[xyz].txtが答えな理由が分かりません。

[]内はxyzの中の1文字だと思ってるのですが、解説お願いします。

2025/08/07 23:24

[]内はxyzの中の1文字だと思ってるのです

そのご認識で間違いありません。
ワイルドカードとして「xyzの中の1文字」が指定されているので、 xyz.txt に対して

  • *xy
  • [xyz]z
  • .txt はそのまま

となるので、一致するのですね。

実際やってみるとこんな感じです。

$ touch xyz.txt
$ ls
xyz.txt
$ ls *[xyz].txt
xyz.txt
$ ls [xyz].txt
ls: cannot access '[xyz].txt': No such file or directory


コメント

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?