이름에 숫자가 포함된 파일이 있는 디렉토리에서 x보다 크거나 작은 파일을 찾는 방법

이름에 숫자가 포함된 파일이 있는 디렉토리에서 x보다 크거나 작은 파일을 찾는 방법

컨텍스트 외("내가 원하는 작업"을 설명하기 위해 비교): 데이터베이스를 쿼리할 때 언제 id > 5 및 id < 99를 선택할 수 있습니까?

CONTEXT-part1: 많은 수의 파일이 포함된 디렉터리에 위치합니다.

CONTEXT-part2: 123.txt 145.txt 233.txt 678.txt와 유사한 파일 이름(순서가 아님)

내가 하고 싶은 일 : 127보다 크고 300보다 작은 파일(파일명) 찾기

예: "part2"에 145.txt 233.txt가 있습니다.

내가 시도하기 시작한 것:find . -regextype sed -regex '.*/[1-9].ref'

하지만 어떻게 하면 더 잘할 수 있을까요?

답변1

zsh셸을 사용하면 와일드카드 패턴은 127에서 300 사이의 숫자로 시작하고 문자열로 끝나는 디렉터리의 모든 이름 part2/<128-299>.txt과 일치합니다 .part2.txt

예:

$ tree
.
|-- part1
|   |-- 123.txt
|   |-- 145.txt
|   |-- 233.txt
|   `-- 678.txt
`-- part2
    |-- 123.txt
    |-- 145.txt
    |-- 233.txt
    `-- 678.txt

2 directories, 8 files
$ printf '%s\n' part2/<128-299>.txt
part2/145.txt
part2/233.txt

이와 같은 쉘에서는 bash다음 패턴 세트가 동일한 작업을 수행합니다.

part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt

전제는 nullglob쉘 옵션이 설정되어 있다는 것입니다, 또는 확장되지 않은 패턴을 얻을 수 있습니다.

$ printf '%s\n' part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
part2/12[89].txt
part2/145.txt
part2/233.txt
$ shopt -s nullglob
$ printf '%s\n' part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
part2/145.txt
part2/233.txt

nullglob예를 들어 가 없는 셸에서는 sh생성된 각 문자열의 존재를 테스트하기 위해 루프를 사용해야 합니다.

for name in part2/12[89].txt part2/1[3-9][0-9].txt part2/2[0-9][0-9].txt
do
    [ -e "$name" ] && printf '%s\n' "$name"
done

의 경우 find쉘이 아닌 경우와 동일한 종류의 패턴을 사용합니다 zsh.

find part2 -name '12[89].txt' -o -name '1[3-9][0-9].txt' -o -name '2[0-9][0-9].txt'

하지만 zsh여기서도 분명히 사용할 수 있습니다.

find part2 -exec zsh -c '[[ $1:t == <128-299>.txt ]]' zsh {} \; -print

이것은 발견된 각 경로 이름에 대해 인라인 zsh스크립트를 호출하고 이 답변의 시작 부분에 있는 것과 유사한 패턴을 사용하여 파일 이름을 비교합니다.

find분명히 아래 하위 디렉토리에도 반복됩니다 part2.

관련 정보