順番に読み進めながら学べます

ファイルを探す — find とワイルドカード

* ? []のワイルドカードで名前をまとめて指定する方法と、findの -nameで名前、-typeで種類を条件に探す方法を、ブラウザ端末で操作しながら学べます。

ワイルドカード — * ? []

ワイルドカードは、ファイル名の一部をまとめて指定するための記号です。

*は 0 文字以上の任意の並び、?はちょうど 1 文字、[]は角かっこ内のいずれか 1 文字に一致します。

ls *.txtのようにlsと組み合わせると、条件に合う名前だけを一覧できます。

ワイルドカードの一致範囲
*.txtfile?.logdata[12].csv.txt で終わる全ファイルfile の後が 1 文字data1.csv か data2.csv
*は任意の並び、?は 1 文字、[]は角かっこ内のいずれか 1 文字に一致します。
記号一致するもの一致例
*0 文字以上の任意の並び*.txta.txt note.txt
?ちょうど 1 文字log?.txtlog1.txtlog10.txtは不一致)
[...]角かっこ内のいずれか 1 文字log[12].txtlog1.txt log2.txt
[a-c]範囲内のいずれか 1 文字f[a-c].txtfa.txt fb.txt fc.txt
touch a.txt b.txt note.log         # 素材ファイルを作成
ls *.txt                           # a.txt b.txt
ls *.log                           # note.log
ls ?.txt                           # a.txt b.txt(1 文字 + .txt)

touch a.txt b.txt note.logで拡張子の違う 3 ファイルを作成してください。

lsにワイルドカードを組み合わせて、.txtで終わるファイルだけを一覧してください。

③ 続けて.logで終わるファイルだけを一覧し、名前で絞り込めることを確認してください。(正しく実行できれば解説が表示されます)

Linux console
0 / 3 実行済み
Loading Linux Terminal...

1 文字だけ・候補を絞る — ? と []

?は必ず 1 文字に一致するため、文字数まで指定したいときに使います。

[]は角かっこ内に書いた文字のどれか 1 つに一致し、[12]なら 1 か 2、[a-c]のように範囲も書けます。

*より細かく対象を絞り込めます。

touch log1.txt log2.txt log9.txt logA.txt   # 素材を作成
ls log?.txt                                  # 末尾が 1 文字の 4 件
ls log[12].txt                               # log1.txt log2.txt のみ

touch log1.txt log2.txt log9.txt logA.txtで連番ふうの 4 ファイルを作成してください。

ls?を組み合わせ、logの後が 1 文字で.txtで終わるファイルを一覧してください。

[]を使ってlog1.txtlog2.txtだけに絞り込んで一覧してください。続けて[1-2]のように範囲指定でも同じ 2 件に絞れることを確認してください。

Linux console
0 / 3 実行済み
Loading Linux Terminal...

条件で探す — find -name / -type

findは起点ディレクトリ以下を再帰的にたどり、条件に合うものを探します。

find 起点 -name 'パターン'で名前を、-type f(ファイル)や-type d(ディレクトリ)で種類を条件にできます。

深い階層に埋もれたファイルを名前で探すときに使います。

条件意味
-name 'パターン'名前がパターンに一致find . -name '*.log'
-type f通常ファイルだけfind . -type f
-type dディレクトリだけfind . -type d
find の条件と対象
find . -name '*.txt'find . -type ffind . -type d名前が .txt の項目ファイルだけディレクトリだけ
-nameは名前のパターン、-type fはファイル、-type dはディレクトリで絞り込みます。
mkdir -p tree/sub                  # 素材ツリーを作成
touch tree/a.txt tree/sub/b.txt    # 階層にファイルを配置
find tree -name '*.txt'            # tree 以下の .txt を再帰検索
find tree -type d                  # tree 以下のディレクトリだけ

find のパターンはクォートで囲む

find . -name '*.txt''*.txt'はシングルクォートで囲みます。

囲まないと*をシェルが先に展開してしまい、意図と違う対象になることがあります。

-nameのパターンは引用符で囲んでfind自身に渡すのが基本です。

mkdir -p tree/subで 2 階層のディレクトリを作成してください。

touch tree/a.txt tree/sub/b.txtで親とサブの両方にファイルを配置してください。

findtreeを起点として渡し、名前の条件で.txtファイルを再帰検索してください。

④ 続けて種類の条件でファイルだけを一覧(find tree -type f)し、さらにディレクトリだけを一覧して、3 つの結果を見比べてください。

Linux console
0 / 5 実行済み
Loading Linux Terminal...
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1ワイルドカードの*は何に一致しますか?

Q2ls log[12].txtはどのファイルに一致しますか?

Q3find tree -type dを実行すると何が表示されますか?