ls
bash拡張ワイルドカードを使用すると、出力に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)
に一致するfoo
orなどのパターンを作成するのに役立ちますbar
。@(foo|bar)-*.txt
matchfoo-hello.txt
などfoo-42.txt
のbar-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])
最新のカーネルファイルに展開します。