「find」コマンドの「-name」オプションでゼロまたは1つの文字をどのように一致させますか?

「find」コマンドの「-name」オプションでゼロまたは1つの文字をどのように一致させますか?

.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

zshglob には**/再帰的な globbing 演算子と glob 修飾子があるため、実行できるほとんどの操作をfindglob として実行できます。 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。デフォルトの正規表現では使用できないため、-EBSDでその式が必要ですfind。 GNU find(少なくとも現在のバージョンでは)では、デフォルトの正規表現はデフォルトの正規表現でも拡張正規表現でもありませんが、いくつかの古代バージョンのemacsからのいくつかの正規表現の変形です。? はいサポートされます。したがって-regextype posix-extended、この場合は必要ありません。


しかし、\{0,1\}後でEREと同じように、1がBREに追加されました。?

関連情報