特定のパターンを持つファイルを探し、他のパターンは無視します。

特定のパターンを持つファイルを探し、他のパターンは無視します。

次のファイルがあります。

1_script1.sql
2_script2.sql
script1.sql
script2.sql

ファイルをインポートし、ファイル所有者を使用してフィルタリングするためfindにのみ使用したいと思います。1_script1.sql2_script2.sql

find . -type f -user oracle -name "\{1..99\}_test*.sql"

ベストアンサー1

and で使用されるパターンは、find単純なシェル glob パターンで、 、 およびのみ認識されます (そしてエスケープ演算子として機能します)。一部の実装では(互換性のない方法で)サポートしても、数値範囲演算子はありません。-name-path?*[...]\-regexfind

デフォルトのglobパターンを使用して1から99までの数字を1桁または2桁の数字で表すには、[1-9]or [0-9][0-9](Cロケールが任意のバイト値を持つファイル名[0-9]と同じで許可されていると仮定)とexcludeが必要です。[0123456789]00

LC_ALL=C find . '(' -name '[1-9]_test*.sql' -o \
                    -name '[0-9][0-9]_test*.sql' \
                ')' ! -name '00_*' -type f -user oracle

-nameファイルメタデータの検索が必要または必要な可能性のあるスキャンよりも安価であるため、最初にスキャンが実行されます。-type一部の-user実装findでは、最適化として内部的に並べ替えを実行します。)

あるいは、10進範囲演算子をzsh持ち、再帰的なglobbingおよびglob修飾子をサポートするglobを使用することもできます。<x-y>

print -rC1 -- **/<1-100>_test*.sql(NDn.u[oracle])

(ここでは1から100までの数字は任意の数字で表示できます(例:)000023_testing.sqlnoN

perl別の方法は、次のものを使用することですFile::Find

perl -MFile::Find -le '
  @user = getpwnam "oracle" or die "oracle user unknown\n";
  find(sub {
         if (/^(\d+)_test.*\.sql\z/s && $1 >= 1 && $1 <= 100) {
           if (@s = lstat$_) {
             print "File::Find::name if -f _ && $s[4] == $user[2];
           } else {warn "$_: $!\n"}
         }
       }, @ARGV)' -- .

おすすめ記事