3つの異なる条件を満たすファイルのリスト

3つの異なる条件を満たすファイルのリスト

lsbashを使って簡単なコマンドで次のことを達成できますか? 2 文字で始まり、e名前に含まれており、11 つ以上の文字で終わるすべてのファイルを一覧表示します。それでは、コマンドとは何ですか?拡張ワイルドカードを有効にする必要がありますか?

ベストアンサー1

ls--includeファイル名と一致しません(/ etc GNU拡張子を考慮しない限り--exclude)。通常、この目的に使用されるのはシェルグローブです。

ls -ld [[:alpha:]][[:alpha:]]*e*[[:alpha:]]

これらの要件に一致するファイルを見つけることができますが、たとえば、欠落していますee。次のことができます。

扱いにくい

使用まさか/とは別に演算子(~)といいえ( ^):

setopt extendedglob
ls -ld [[:alpha:]](#c2)*~^*e*~^*[[:alpha:]]

または、perlプレビュー正規表現演算子などを使用します。

setopt rematchpcre
match() [[ $REPLY =~ '^(?=.*e)(?=.*[[:alpha:]]$)[[:alpha:]][[:alpha:]]' ]]
ls -ld *(+match)

クッシュ 93

&内部的に使用@(...):

ls -ld @([[:alpha:]][[:alpha:]]*&*e*&*[[:alpha:]])

と同じ改善する正規表現(enabledを使用~(X:...)):

ls -ld ~(X:[[:alpha:]][[:alpha:]].*&.*e.*&.*[[:alpha:]])

または、Perlに似た予測演算子を使用してください。

ls -ld ~(P:(?=.*e)(?=.*[[:alpha:]]$)[[:alpha:]][[:alpha:]])*

強く打つ

bashいいえそして演算子ですが、ksh対応するオプションが有効な場合は、演算子のサブセットをサポートしているため、次のことができます。extglob

shopt -s extglob
ls -ld @([[:alpha:]]?([[:alpha:]]*)e?(*[[:alpha:]])|e[[:alpha:]]?(*[[:alpha:]]))

@(x|y)(例zsh:)(x|y)またはオペレーター。?(x)オプションですxzsh' (x|);と同様に/@(x|)とも機能します)。kshbash

もう一つの秘訣は、次の事実を活用することです。「AとB」はい「いいえ((A)でもなく(B)でもない)」、サポートされているksh globのサブセットには、次のものがbash含まれます。いいえそしてまたは演算子を使用すると、次のことができます。

ls -ld !(!([[:alpha:]][[:alpha:]]*)|!(*e*)|!(*[[:alpha:]]))

これらの演算子は、対応する演算子が元の場所ksh(すべてのバリアント、なし)でも機能します。shopt

非グローバルなアプローチ

そしてfind

find . ! -name . -prune -name '[[:alpha:]][[:alpha:]]*' \
                        -name '*e*' \
                        -name '*[[:alpha:]]' -exec ls -ld {} +

(ファイルリストはソートされず、有効な文字を構成しないバイトを含むファイル名は除外されます。ファイル名にもプレフィックスが付いています。./

おすすめ記事