"-105x135.jpg", "-410x410.jpg" 등, "780-105x135.jpg" 및 "candyswing-2-klein-ohrringe-schale-038-135x160.jpg"로 끝나는 파일이 포함된 폴더가 많이 있습니다. "예를 들어, 온라인 정규식을 사용하여 다음 패턴을 생성하여 찾아서 삭제해야 [0-9]x..[0-9].jpg
하지만 find . -regex '[0-9]x..[0-9].jpg'
결과가 표시되지 않습니다.
답변1
페이지 에 따르면 man
이 -regex
옵션은 다음과 같습니다.전체 경로, 즉. 이것모두파일 이름그리고전체 디렉토리 경로 부분도 있으므로 정규식 앞에 추가해야 합니다 .*
. 해당 페이지에는 몇 가지 명확한 예가 있습니다 man
.
또한 이 옵션을 염두에 두십시오 -regextype
. 기본값(페이지당) man
은 이지만 emacs
다른 옵션은 posix-awk
, posix-basic
및 입니다 posix-egrep
. posix-extended
스스로를 기절시키세요.
답변2
또 다른 옵션은 bash의 globstar 옵션을 사용하는 것입니다:
shopt -s globstar
목록:
ls **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg
또는 삭제:
rm **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg
문서.
위의 glob 패턴은 제공한 정규식과 약간 다릅니다.어느마지막 두 문자는 x
엄밀히 말하면 숫자가 아닙니다. 즉, 이름이:인 파일은 somefile-135xyz9.jpg
정규식과 일치하지만 위의 glob과는 일치하지 않습니다.
glob은 재귀적으로( **
) 다음 파일과 일치합니다.
- 무엇이든 시작하세요 (
*
) - 세 개의 숫자가 있습니다 (세 개
[0-9]
) - 그 다음에
x
- 그 뒤에 숫자 3개
- 이어서
.jpg
이 접근 방식의 한 가지 위험은 일치하는 파일 수가 명령줄 매개 변수 공간을 초과하는 경우입니다. 이 경우 파일 이름을 배열에 저장하고 배열을 개별적으로 반복할 수 있습니다.
알아 보려면 다음을 수행하십시오.
files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg)
for file in "${files[@]}"; do echo Would: rm -- "$file"; done
제거하다:
files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg)
for file in "${files[@]}"; do rm -- "$file"; done