私は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:]])
答え2
ls -q | grep -Ex '[[:alnum:]]{5}'
答え3
ls
前述の方法で使用するには、この-d
オプションを使用する必要があります。それ以外の場合はリストが表示されます。コンテンツどの目次
彼らの名前は名前自体をリストするのではなく、5つの文字や数字で構成されています。または、次のことができます。
ls -d [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]]
しかし、それは今あなたが得る答えと同じです。
また、そうでない場合必要ls
コマンドで使用するには、次のものを使用できます。
echo [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]]
これにより、すべての一致が1行に表示されます。
printf "%s\n" [[:alnum:]][[:alnum:]][[:alnum:]][[:alnum:]][:alnum:]]
これは別の行にリストされます。
答え4
変数から式を作成する:
e=""; for m in $(seq 1 5); do e="$e[A-Za-z0-9]"; done
素敵で再利用可能にするには、関数に入れてください。
alnumglob() {
local e=""
for m in $(seq 1 $1) ; do e="$e[A-Za-z0-9]"; done
echo "$e"
}
ls -ld $(alnumglob 5)