ls
bashを使って簡単なコマンドで次のことを達成できますか? 2 文字で始まり、e
名前に含まれており、1
1 つ以上の文字で終わるすべてのファイルを一覧表示します。それでは、コマンドとは何ですか?拡張ワイルドカードを有効にする必要がありますか?
答え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)
オプションですx
(zsh
' (x|)
;と同様に/@(x|)
とも機能します)。ksh
bash
もう一つの秘訣は、次の事実を活用することです。「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 {} +
(ファイルリストはソートされず、有効な文字を構成しないバイトを含むファイル名は除外されます。ファイル名にもプレフィックスが付いています。./
)