ある文字列のパターンを記述することで、複数の文字列を一度に生成する機能としてブレース展開がありました。
【図解:bash】ブレース展開の使用方法
ブレースとは、中カッコ { }のことで、この中にパターンを記述することにより、複数の文字列を一度に生成することができる機能です。これらはシェルスクリプトでよく使われますし、一度に多数のファイル作成できるなど、処理の効率化も図れます。パターン...
Linuxでは、ファイル名を指定してなんらかの処理をすることが多くあります。
ブレース展開と似た考え方になりますが、ある文字列のパターンを記述することで、複数のファイル名・ディレクトリ名を指定することができます。これをパス名展開といいます。
任意の文字列を指定するための特殊文字をワイルドカード(Wildcards)といい、この記事では、ワイルドカードを使用したパス名展開の使用方法を確認していきます。
カレントディレクトリ内のファイル名やディレクトリ名の一覧は下記とします。
hirotano@linux-1:~$ ls -l
合計 8
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:17 1-music
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:17 11-music
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:17 2-music
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:05 Backup111
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:05 Backup222
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:05 Backup333
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:06 IMAGE
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:05 IMAGE1
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:06 IMAGE12
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:04 data1
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:04 data11
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:04 data111
drwxrwxr-x 2 hirotano hirotano 4096 12月 24 06:03 dir1
drwxrwxr-x 2 hirotano hirotano 4096 12月 24 06:03 dir11
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:04 file1
-rw-rw-r-- 1 hirotano hirotano 0 12月 24 06:04 file2.txt
任意の文字列(*)
ここで、下記のコマンドを実行します。echo コマンドは、引数の文字を画面に表示するコマンドです。
hirotano@linux-1:~$ echo *
1-music 11-music 2-music Backup111 Backup222 Backup333 IMAGE IMAGE1 IMAGE12 data1 data11 data111 dir1 dir11 file1 file2.txt
* は、任意の文字列を表すワイルドカードです。
現在のディレクトリ配下にあるファイル名やディレクトリ名が一気に表示されました。
これがパス名展開です。*の前に、./ が省略されていると考えるとわかりやすいかもしれません。
先頭文字を指定した展開
dから始まる名前のパス名展開をする場合は、先頭にdとし、その後につづく文字列は任意であるため、下記のコマンドとなります。
hirotano@linux-1:~$ echo d*
data1 data11 data111 dir1 dir11
末尾の文字列を指定した展開
末尾の文字が11で終了する名前のパス名展開をする場合は、任意の文字列のあとで、最後が11となるため、下記のコマンドとなります。
hirotano@linux-1:~$ echo *11
Backup111 data11 data111 dir11
開始、および終了の文字列を指定して展開
上の2パターンを組み合わせることもできます。
例えば、dで始まり、終了が11で終わる名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo d*11
data11 data111 dir11
任意の1文字(?)
?は、任意の1文字を表すワイルドカードです。。?を5回連続で記述すると、任意の5文字となります。
下記のとおり、5文字のファイル・ディレクトリ名が取得できました。
hirotano@linux-1:~$ echo ?????
IMAGE data1 dir11 file1
先頭の文字数を指定した展開
先頭が任意の3文字で、11で終わる名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo ???11
dir11
末尾の文字数を指定した展開
fで始まり、最後は3文字の拡張子(ドットの後に任意の3文字)の名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo f*.???
file2.txt
文字指定([ ])
いずれかの文字に指定して展開したい場合は、大かっこ[ ]の中で指定する文字を記述します。
例えば、AかBかCのいずれかの文字であることを指定する場合は、[ABC]と記述します。
指定文字のいずれかで展開
AかBかCのいずれかの文字で始まる名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo [ABC]*
Backup111 Backup222 Backup333
指定した文字範囲で展開
連続した文字列なら、ハイフン(-)を使って、範囲を指定することもできます。
aからfまでのいずれかの文字を指定する場合、[abcdef]ではなく、[a-f]と指定できます。
aからfのいずれかの文字で始まる名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo [a-f]*
data1 data11 data111 dir1 dir11 file1 file2.txt
指定した数字範囲で展開
数字の範囲指定もできます。
例えば、任意の文字ではじまり、末尾が1~3で3桁の数字で終わる名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo *[1-3][1-3][1-3]
Backup111 Backup222 Backup333 data111
指定した文字を含めず展開
指定した文字を含まないようにする場合は、文字の前に ! をつけます。
例えば、上の例で、末尾が1~3で2桁だけに指定したいとします。この場合は、末尾の3桁目は、1~3の数字ではいけないので、範囲指定の前に ! をいれます。
hirotano@linux-1:~$ echo *[!1-3][1-3][1-3]
IMAGE12 data11 dir11
末尾が2桁の名前だけがパス名展開されます。
文字列指定({ })
複数の文字列のいずれかを指定したい場合は、中カッコ{ }にカンマ(,)区切りで文字列を記述します。
file1、もしくはdataで始まる名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo {file1,data*}
file1 data1 data11 data111
文字クラス定義([[: :]])
大文字、小文字など、文字種別を指定したい場合は、文字クラスを指定します。
例えば、大文字であれば、クラス名は、upper で、指定する場合は、[[:upper:]]と表記します。
大文字(upper)
大文字で始まる名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo [[:upper:]]*
Backup111 Backup222 Backup333 IMAGE IMAGE1 IMAGE12
小文字(lower)
小文字の場合は、[[:lower:]]と表記します。
小文字で終わる名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo *[[:lower:]]
1-music 11-music 2-music file2.txt
数字(digit)
数字の場合は、[[:digit:]]と表記します。
数字で始まる名前のパス名展開をする場合は、下記のコマンドとなります。
hirotano@linux-1:~$ echo [[:digit:]]*
1-music 11-music 2-music
コメント