web-dev-qa-db-ja.com

ファイル名のシェル展開(A | B)?

たとえばファイルを読み取るときに、シェルでorの選択肢を拡張することは可能ですか?.

つまり、たとえば、grepは_(A|B)_のような構文をサポートしており、ファイル内のAまたはBに一致します。

同様に、これらのファイルがある場合:

_file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
_

bashで_cat file{1..5}.txt_を実行すると、範囲が拡張されます。いくつかのファイルに対してこれを行う同等の方法はありますか?

例えば。 cat file(1|5).txtそして、それら2つだけを出力しますか?

9
Joe Healey

一致する標準のファイル名グロビングパターン数字は_[0-9]_です。これは1桁に一致します。

_cat file[0-9].txt
_

これらのうち2つだけを選択するには:

_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
_

@(...)パターンは、含まれている_|_区切りのパターンのいずれかに一致します。


_[...]_と@(...)のような展開パターンとブレース展開の違いは、ブレース展開がコマンドラインで生成であり、実際の既存の名前と一致しない場合があることです。現在のディレクトリ。ファイル名のグロビングパターンは名前と一致しますが、可能な名前がすべて存在しない場合でも、シェルは文句を言いません。 no一致する名前が存在する場合、nullglob Shellオプションも設定されていない限り、パターンは展開されずに残ります。この場合、パターンは削除されます。

例:

_touch file1

ls file[0-9]
_

ここでは、_file1_のファイルリストのみが表示されます。

_ls file{0..9}_を使用すると、lsは_file0_、_file2_などが見つからないことを報告します。

次の例では、最初のコマンドは指定されたパターンに一致する既存の名前のみを操作し、2行目はまだ存在しないファイルを作成します。

_touch file[0-9]

touch file{0..9}
_
16
Kusalananda

使用する構文はfile{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

Inianが以下でも指摘しているように、この例の場合、touch file{1..9}を実行する方が簡単です...

$ 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(926)ファイルを作成します。

7
thecarpy

はい、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

または、ファイルが見つからなかった場合にエラーについて文句を言わないglob式file[15]を使用します。

cat file[15].txt
6
Inian