다음과 같은 파일이 있습니다.
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)' -- .