Bash拡張ワイルドカード

Bash拡張ワイルドカード

lsbash拡張ワイルドカードを使用すると、出力に1つのファイルしか表示できません。

~からinfo bash

  If the `extglob' shell option is enabled using the `shopt' builtin,
several extended pattern matching operators are recognized.  In the
following description, a PATTERN-LIST is a list of one or more patterns
separated by a `|'.  Composite patterns may be formed using one or more
of the following sub-patterns:

`?(PATTERN-LIST)'
     Matches zero or one occurrence of the given patterns.

`*(PATTERN-LIST)'
     Matches zero or more occurrences of the given patterns.

`+(PATTERN-LIST)'
     Matches one or more occurrences of the given patterns.

`@(PATTERN-LIST)'
     Matches exactly one of the given patterns.

`!(PATTERN-LIST)'
     Matches anything except one of the given patterns.

shops -s extglob

ls -l /boot/@(vmlinuz*)
-rw-r--r--  1 root root 1829516 Apr 21  2009 /boot/vmlinuz-2.6.9-89.EL
-rw-r--r--  1 root root 1700492 Apr 21  2009 /boot/vmlinuz-2.6.9-89.ELsmp

ls -l /boot/?(vmlinuz*)
-rw-r--r--  1 root root 1829516 Apr 21  2009 /boot/vmlinuz-2.6.9-89.EL
-rw-r--r--  1 root root 1700492 Apr 21  2009 /boot/vmlinuz-2.6.9-89.ELsmp

1つのファイルのみを表示する方法は?

ベストアンサー1

Bashには、複数の一致のうちの1つだけを拡張する機能はありません。

パターンは@(foo)1つだけ一致します。発生する写真foo。つまり、一致fooが一致しませんfoofoo。この構文形式は、or@(foo|bar)に一致するfooorなどのパターンを作成するのに役立ちますbar@(foo|bar)-*.txtmatchfoo-hello.txtなどfoo-42.txtbar-42.txt長いパターンの一部として使用できます。

複数の一致のいずれかを使用するには、一致を配列に配置し、その配列の要素を使用できます。

kernels=(vmlinuz*)
ls -l "${kernels[0]}"

一致は常にアルファベット順にソートされるため、最初の一致はアルファベット順に印刷されます。

パターンがファイルと一致しない場合は、変更されていないパターンである単一の要素を含む配列が得られます。

$ a=(doesnotmatchanything*)
$ ls -l "${a[0]}"
ls: cannot access doesnotmatchanything*: No such file or directory

nullglob空の配列を取得するには、オプションを設定します。

shopt -s nullglob
kernels=(vmlinuz*)
if ((${#kernels[@]} == 0)); then
  echo "No kernels here"
else
  echo "One of the ${#kernels[@]} kernels is ${kernels[0]}"
fi

Zshにはここに便利な機能があります。これグローバル予選 [NUM]パターンはNUM番目の一致のみに拡張されます。このバリアントは、NUM1番目の一致からNUM2番目の一致まで拡張されます(1から始まり)。[NUM1,NUM2]

% ls -l vmlinuz*([1])
lrwxrwxrwx 1 root root 26 Nov 15 21:12 vmlinuz -> vmlinuz-3.16-0.bpo.3-amd64
% ls -l nosuchfilehere*([1])
zsh: no matches found: nosuchfilehere*([1])

一致するファイルが存在しない場合、glob修飾子によりNパターンが空のリストに展開されます。

kernels=(vmlinuz*(N))
if ((#kernels)); then
  ls -l $kernels
else
  echo "No kernels here"
fi

glob修飾子は、om名前(変更時間の場合)ではなく、年齢に基づいてm一致をソートしますOm。したがって、vmlinuz*(om[1])最新のカーネルファイルに展開します。

おすすめ記事