or
たとえば、ファイルを読み取るときにシェルが選択項目を拡張できるかどうか。
たとえば、grep
ファイル内のAまたはBを一致させるなどの構文がサポートされています。(A|B)
同様に、次のファイルがある場合:
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
範囲が広くなるのでできますよcat file{1..5}.txt
。bash
いくつかのファイルに対してこれを行う同等の方法はありますか?
たとえばcat file(1|5).txt
、2? のみ印刷してください。
答え1
一致させる標準ファイル名ワイルドカードパターン数字はい[0-9]
。これは単一の数字と一致します。
cat file[0-9].txt
次のいずれかを選択してください。
cat file[25].txt
9より大きい数字の場合は、中括弧拡張が便利です(ただし、ワイルドカードパターンと中括弧拡張の違いについては、以下の注意事項を参照してください)。
cat file{25..60}.txt
同様に、中括弧拡張を使用すると、個々の数字が許可されます。
cat file{12,45,900,xyz}.txt
(上記の例では、中括弧拡張は算術ループを含まず、単に提供された文字列に基づいて名前を生成します。)
では、シェルオプション()を有効にするとbash
次のことも機能します。extglob
shopt -s extglob
cat file@(12|45|490|foo).txt
このパターンは、 - 区切り文字を含む@(...)
すべてのパターンと一致します。|
[...]
中括弧拡張などのワイルドカードパターンの違いは、中@(...)
括弧拡張が次のようになることです。コマンドラインから生成現在のディレクトリにある既存の名前と実際には一致しない可能性があります。ファイル名ワイルドカードパターンは名前と一致しますが、可能な名前がすべて存在しなくてもシェルは文句を言いません。もしいいえnullglob
一致する名前がある場合、シェルオプションも設定されていない場合、パターンは拡張されていません。この場合、パターンは削除されます。
例:
touch file1
ls file[0-9]
file1
ここではファイルのリストのみが表示されます。
あなたがそれを持っているならls file{0..9}
、ls
あなたはそれを見つけることができないと文句を言うでしょfile0
うfile2
。
次の例では、最初のコマンドは既存の名前与えられたパターンと一致しますが、2行目はまだ存在しないファイルを生成します。
touch file[0-9]
touch file{0..9}
答え2
使用する構文はsumfile{1,2}
と評価されます。file1
file2
$ ls
$ touch file{1,2,3,4,5,6,7,8,9}
$ ls
file1 file2 file3 file4 file5 file6 file7 file8 file9
touch file{1..9}
Inianが以下に指摘したように、この例では実行するのが簡単になります。
$ ls
$ touch file{1..9}
$ ls
file1 file2 file3 file4 file5 file6 file7 file8 file9
次のように複数の式を使用することもできます。
$ ls
$ touch file{1..9}{a..z}
$ ls
file1a file1b file1c
[...]
file9x file9y file9z
はい、上記の操作を実行すると、234(9
回26
)のファイルが作成されます。
答え3
はい、シェルで中括弧拡張を使用できますbash
。いくつかのファイルの場合は、単にまたはfile{1..2}
好きです。file{1,2}
あるいは、場合によってはファイルが存在しないことを心配している場合は、単純なループを実行してください。
for file in file{1..4}.txt; do
[ -f "$file" ] || continue
echo "$file" # Do other actions on file here
done
または、接続のみがファイルに対する唯一の操作である場合不確実ないつでも存在しないようなファイルは表示してcat
エラーを抑制してください。/dev/null
ファイルが利用できない場合は、標準エラーにリダイレクトするとエラーが抑制されます。
cat file{1,5}.txt 2>/dev/null
file[15]
または、ファイルが見つからなくてもエラーを表示しないglob式を使用してください。
cat file[15].txt