find . -name 'Name*'
기본 이름을 공유하지만 파일과 일치 하도록 끝에 크기 정보가 추가된 일부 이미지 파일을 일치시키려고 합니다 . 예를 들면 다음과 같습니다.
Name.jpg
[email protected]
Name-180x101.jpg
[email protected]
그러나 내 전역 패턴도 일치합니다.
NameLonger.jpg
[email protected]
NameLonger-180x101.jpg
[email protected]
두 번째 그룹은 인기가 없습니다.
find
첫 번째 그룹을 공격하고 두 번째 그룹을 무시하도록 명령을 어떻게 조정할 수 있나요 ? 전역 패턴을 사용할 수 있습니까, 아니면 정규식이 필요합니까?
참고: 이 경우 크기 정보(-180x101)는 항상 "-", 임의의 숫자, "x", 임의의 숫자 순입니다. 파일에 "@2x"가 포함되어 있으면 항상 끝에 있습니다.
참고: 일반 파일(예: Name.jpg
.
미리 감사드립니다.
답변1
를 사용하여 zsh
원하는 파일 이름 형식을 지정합니다.
print -rC1 -- **/Name(-<->x<->|)(@<->x|).jpg(DN)
print -rC1
:print
r
아,1
C
칼럼 에 대해서요**/
: 재귀적 와일드카드(a|b)
:(x|)
ERE 처럼 번갈아가며(x)?
<x-y>
: 정수 x에서 y까지의 일련의 10진수를 나타내며<->
임의의 숫자의 일련의 숫자를 나타냅니다.D
:dotglob
: 이와 같이 숨겨진 디렉토리도 볼 수 있습니다find
.N
:nullglob
: 일치하는 항목이 없으면 불평하지 말고 아무것도 없는 것으로 확장하세요.
GNU find
동등(파일 순서가 없으며 ./
각 경로에 접두사가 붙음):
LC_ALL=C find . -regextype posix-extended -regex \
'.*/Name(-[0-9]+x[0-9]+)?(@[0-9]+x)?\.jpg'
(BSD의 경우 대신 find
사용 )find -E .
find . -regextype posix-extended
표준을 사용하면 find
아마도 다음과 같습니다.
find . -name '.*/Name[-@.]*'
필요한 것은 배제뿐이라면 그것으로 충분합니다 NameLonger
.
단순 와일드카드 패턴에는 OR +
연산자 에 해당하는 패턴이 없습니다 ?
. |
여러 -name
AND를 ! -name
사용하여 AND 및 OR로 동일한 작업을 수행 할 수 있지만(예: 수락 Name-*x*.jpg
하지만 거부, , Name-*[!0-9]*x*[!0-9]*.jpg
등) 모든 경우를 처리하려면 이러한 작업이 수백 번 필요하므로 매우 번거로울 수 있습니다.Name-x*
Name-*x.jpg
fnmatch()
이 함수 ( 에서 사용 ) 의 GNU libc 구현은 정규식 동등성을 가져오는 find -name
일부 ksh88 확장 glob 연산자(플래그)를 지원하도록 지시할 수 있습니다 ( , ... 또한 or 에서도 지원됨 ). 그러나 내가 아는 한, 심지어는 GNU 구현에서는 이를 사용하도록 지시할 수 있습니다.FNM_EXTMATCH
+(...)
?(...)
zsh -o kshglob
bash -O extglob
find
POSIXly에서는 다음을 통해 일치를 최적화할 수 있습니다 awk
.
LC_ALL=C find . -name 'Name*' -exec awk '
BEGIN {
for (i = 1; i < ARGC; i++)
if (ARGV[i] ~ "/Name(-[0-9]+x[0-9]+)?(@[0-9]+x)?\\.jpg$")
print ARGV[i]
}' {} +
(일부 파일의 경로가 너무 길어서 명령줄에 맞지 않으면 실패할 수 있다는 점을 명심하세요. 어쨌든 모든 find
구현이 그보다 긴 경로를 가진 파일을 찾을 수 있는 것은 아닙니다 PATH_MAX
.)