.ly
たとえば、このディレクトリとで終わるサブディレクトリ内のすべてのファイルを一致させようとします.ily
。これまでは、find . -name "*.*ly" -print
これが私が得ることができる最も近いものですが、私が望んでいないファイル名を見つけることもできます。
答え1
-o
「または」オプションであるこのオプションを使用できます。
最も簡単なバージョンは
find . -name '*.ly' -o -name '*.ily'
-print
これは基本的な操作であるため機能します。
しかし、これが-print
単なる例であれば、これら2つの節を組み合わせる必要があるかもしれません。
find . \( -name '*.ly' -o -name '*.ily' \) -print
答え2
zsh
glob には**/
再帰的な globbing 演算子と glob 修飾子があるため、実行できるほとんどの操作をfind
glob として実行できます。 0または1、別名。任意に選択できるそこで何かをすることができます(|something)
(何もしないか、何(#cX,Y)
)、正規表現に似た任意の間隔{X,Y}
演算子もありますが(必須set -o extendedglob
):
print -rC1 -- **/*.(|i)ly(N)
find
これは、ソートされたリストの提供、隠しファイルのスキップ(D
必要に応じて修飾子の使用)、./
プレフィックスの防止、および任意のファイル名の使用(多くの実装にfind
は有効なテキストではなくファイル名のGNUブロックを含むfind
)ロケール)と比較して、ユーザーに利点があります。単に印刷する以上のものが必要な場合は、ファイルリストを処理する方が簡単で安全なことがよくあります。
答え3
-regex
別の解決策は、find
それをサポートする実装で使用することです。
そして牛に似た一種の栄養find
:
find -regex '.*\.i?ly'
# or the full command
find . -regextype posix-extended -regex '.*\.i?ly'
そしてBSDfind
:
find -E . -regex '.*\.i?ly'
この-regex
オプションはフルパスと一致し、開始と終了の両方に固定されているため、終了ではなく開始に必要です.*
。$
?
は拡大する正規表現演算子(と同様grep -E
)は、前の原子(ここ)の0または1と一致しますi
。デフォルトの正規表現では使用できないため、-E
BSDでその式が必要ですfind
。 GNU find
(少なくとも現在のバージョンでは)では、デフォルトの正規表現はデフォルトの正規表現でも拡張正規表現でもありませんが、いくつかの古代バージョンのemacsからのいくつかの正規表現の変形です。?
はいサポートされます。したがって-regextype posix-extended
、この場合は必要ありません。
しかし、\{0,1\}
後でEREと同じように、1がBREに追加されました。?