私はls
bashでこのコマンドを使用し、長さnのすべてのファイルまたはディレクトリを見つけようとしています。 n=5 と仮定
私のコマンドは次のとおりです。
ls ?????
ただし、これにはピリオドなどのアルファベット以外の文字も含まれます。たとえば、次のファイルが一致します。
ab.cd
abd.c
5つの英数字名を持つファイルだけを一致させたいのです。
five1
five2
five3
しかし、
abc.d
ab.cd
a.bcd
コマンドをどのように修正しますか?
答えを見つけてください:
ls [a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]
答えを見つけましたが、どうすればそれほど悪くすることができますか?
ベストアンサー1
これらのワイルドカードは解釈されませんls
。これらのグローブはシェルによってファイル名のリストに展開され、引数として渡されますls
。標準グロブにはいくつかの拡張(借用とアクティブ化)bash
がありますが、他のシェルと比較してまだ制限があります。ksh88
shopt -s extglob
zsh
ksh93
そしてzsh
:
setopt extendedglob
ls -d [[:alnum:]](#c5)
ksh93
:
ls -d {5}([[:alnum:]])
または:
ls -d {5}(\w) # (\w includes underscore in addition to alnums)
または拡張正規表現を使用する場合:
ls -d ~(E)^[[:alnum:]]{5}$
bash
同等のワイルドカードを持たない他のPOSIXシェルの場合は、次のことを行う必要があります。
ls -d [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]]
[[:alnum:]]
現在、ロケールのすべてのアルファベット文字(英語、ラテン文字だけでなく)、および0123456789
(他の種類の数字も含めることができます)が含まれています。英語のアルファベット文字が必要な場合は、文字名を個別に指定してください。
c='[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]'
unset -v IFS
ls -d $c$c$c$c$c
またはCロケールを使用してください。
(export LC_ALL=C
ls -d [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]])