次のファイルがあります。
1_script1.sql
2_script2.sql
script1.sql
script2.sql
ファイルをインポートし、ファイル所有者を使用してフィルタリングするためfind
にのみ使用したいと思います。1_script1.sql
2_script2.sql
find . -type f -user oracle -name "\{1..99\}_test*.sql"
ベストアンサー1
and で使用されるパターンは、find
単純なシェル glob パターンで、 、 およびのみ認識されます (そしてエスケープ演算子として機能します)。一部の実装では(互換性のない方法で)サポートしても、数値範囲演算子はありません。-name
-path
?
*
[...]
\
-regex
find
デフォルトの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.sql
。n
oN
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)' -- .