지정된 패턴으로 끝나는 파일을 반복적으로 찾습니다.

지정된 패턴으로 끝나는 파일을 반복적으로 찾습니다.

"-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

관련 정보