우리 코드는 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
-
-E
grep
sed