컨텍스트 외("내가 원하는 작업"을 설명하기 위해 비교): 데이터베이스를 쿼리할 때 언제 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
.