ls で n 文字のファイル名を照合する

ls で n 文字のファイル名を照合する

私はlsbashのコマンドを使って、長さ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などのシェルと比較するとまだ制限があります。zshksh93

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文字または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)

関連情報