web-dev-qa-db-ja.com

複数のパターンにマッチする `find -name`パターン

私はfind Documents -name "*.{py,html}"というコマンドでディレクトリ内のすべてのpythonとhtmlファイルのリストを取得しようとしていました。

それから、manページがやってきました。

パターン内の中括弧( '{}')は特別なものとは見なされません(つまり、find。-name 'foo {1,2}'は、ファイルfoo1およびfoo2ではなく、foo {1,2}という名前のファイルと一致します。

これはパイプチェーンの一部なので、実行時にどの拡張子と一致するかを指定できるようにしたい(ハードコーディングなし)。 findがそれを実行できないのであれば、Perlのワンライナー(または同様のもの)で問題ありません。

編集:私が最終的に思いついた答えにはあらゆる種類のがらくたが含まれていて、それも少し長いので、私はそれを という答えとして投稿しました 元の痒み私は擦り傷を付けようとしていました。もっと良い解決策があれば、気軽にハックしてください。

281
Xiong Chiamiov

-oを使用します。これは "or"を意味します。

find Documents \( -name "*.py" -o -name "*.html" \)

編集:すみません、質問をもう一度お読みください。プログラムでそのコマンドラインを作成する必要がありますが、それは簡単ではありません。

あなたはbash(またはWindows上のCygwin)を使用していますか?あなたがそうであれば、あなたはこれを行うことができるはずです:

ls **/*.py **/*.html

プログラム的に構築する方が簡単かもしれません。

編集:回答に@artbristolコメントを適用しました。

423
RichieHindle

Findのいくつかのエディションは、ほとんどがLinuxシステムで、おそらく他のものでも同様に、-regexと-regextypeオプションをサポートします。これは、正規表現に一致する名前のファイルを見つけます。

例えば

find . -regextype posix-egrep -regex ".*\.(py|html)$" 

上記の例のトリックをするべきです。しかし、これは標準のPOSIX検索機能ではなく、実装に依存します。

48
intelekt

プログラムで-nameで区切ってさらに-or句を追加できます。

find Documents \( -name "*.py" -or -name "*.html" \)

または、代わりに単純なループに進みます。

for F in Documents/*.{py,html}; do ...something with each '$F'... ; done
28
Stephan202

私も同じようなニーズがありました。これは私のために働いた:

find ../../ \( -iname 'tmp' -o -iname 'vendor' \) -Prune -o \( -iname '*.*rb' -o -iname '*.rjs' \) -print
11
bkidd

これにより、Linux上のすべての.cファイルまたは.cppファイルが検索されます。

$ find . -name "*.c" -o -name "*.cpp"

追加の改造をしない限り、エスケープ括弧は必要ありません。こちらのmanページから、パターンが一致するかどうかを印刷しています。おそらく彼らは印刷を制御しようとしています。この場合、-printは条件付きとして機能し、「AND」条件付きになります。 .cファイルが印刷されるのを防ぎます。

$ find .  -name "*.c" -o -name "*.cpp"  -print

しかし、あなたが最初の答えが好きなら、あなたは印刷を制御することができます。これにより、すべての.cファイルも検索されます。

$ find . \( -name "*.c" -o -name "*.cpp" \) -print
9
netskink

私のデフォルトはされています:

find -type f | egrep -i "*.Java|*.css|*.cs|*.sql"

Brendan LongとStephan202他によるプロセス集中型のfind実行のように:

find Documents \( -name "*.py" -or -name "*.html" \)

4
Paul
#! /bin/bash
filetypes="*.py *.xml"
for type in $filetypes
do
find Documents -name "$type"
done

シンプルだがうまくいく:)

2
mnrl

私はいくつかのファイルを除いて、子ディレクトリのすべてのファイルを削除する必要がありました。以下は私にとってうまくいった(3つのパターンが指定されている):

find . -depth -type f -not -name *.itp -and -not -name *ane.gro -and -not -name *.top -exec rm '{}' +
1
Adobe
find MyDir -iname "*.[j][p][g]"
+
find MyDir -iname "*.[b][m][p]"
=
find MyDir -iname "*.[jb][pm][gp]"
1
user7531934

どうですか?

ls {*.py,*.html}

ファイル名に.pyまたは.htmlで終わるファイルをすべてリストします。

0
Dr_Hope

orを含む名前パターンには、パターン\(\)内の中括弧が必要です

find Documents -type f \( -name "*.py" -or -name "*.html" \)

and演算子を使用した名前パターンの場合、必須ではありません

find Documents -type f ! -name "*.py" -and ! -name "*.html" 
0
Chetabahana

これはAIX kornシェルで動作します。

find *.cbl *.dms -Prune -type f -mtime -1

これは、1日前の*.cblまたは*.dmsを現在のディレクトリでのみ探し、サブディレクトリをスキップします。

0
Abdul M Gill