두 개의 다른 이름을 찾는 방법

두 개의 다른 이름을 찾는 방법

우리 코드는 stdout, stdout.qsub, stderr, stderr.foo 등의 이름을 가진 수많은 파일을 생성합니다.

나하고 싶어

find <dir> -name (stdout|stderr) -exec ...

그리고 stdout 및 stderr 파일만 발견되고 stdout.qsub 등은 발견되지 않습니다.

그래서 나는 할 수 없습니다 -name "std*" . 이 경우 -name "std[eo][ru][rt]"를 수행할 수 있으며 해당 검색에서는 stdeut 파일을 찾을 수 없기 때문에 작동합니다.

'-name "std[eo][ru][rt]"'보다 더 깔끔한 방법이 있나요?

답변1

find "$dir" \( -name stdout -o -name stderr \) -exec ...

또는 GNU를 사용하십시오 find.

find "$dir" -regextype posix-extended -regex ".*/(stdout|stderr)" 

-regex전체 경로가 일치하고 더 -path유사하며 정규식은 마치 -name시작과 끝에 암시적인 부분이 있는 것처럼 고정됩니다. 또한 이후는 모든 시퀀스와 일치합니다.^$.*수치, 로케일의 문자로 경로를 디코딩할 수 없는 디렉토리에서는 stdout/파일을 찾지 않습니다.stderr

$dir또한 -조건자 이름으로 시작하거나 정확히 일치하는 경우 실패할 것이라는 점에 유의하세요 find.

BSD를 사용하면 find다음을 수행할 수 있습니다.

find -E -f "$dir" -- -regex '.*/std(out|err)'

위의 내용은 "$dir"옵션에 인수로 전달되므로 -f로 시작하는 값에 대해 모호함도 없고 문제도 없습니다. for 또는 와 같은 확장 정규식을 활성화합니다.$dir--Egrepsed

관련 정보