특정 패턴이 있는 파일을 찾고 다른 패턴은 무시합니다.

특정 패턴이 있는 파일을 찾고 다른 패턴은 무시합니다.

다음과 같은 파일이 있습니다.

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.sql정렬(숫자 사용)이 제공되지만 한정자를 사용하여 이를 비활성화할 수 있습니다 ).noN

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)' -- .

관련 정보