정규식 패턴과 일치하는 파일 이동

정규식 패턴과 일치하는 파일 이동

수천 개의 파일이 포함된 디렉토리가 있습니다. 이들 중 다수는 파일 이름이 이미지 해상도로 시작하는 이미지입니다. 이미지의 높이와 너비는 2자리, 3자리, 4자리 또는 5자리일 수 있습니다. 예를 들어:

 - 986x1088_lalbslj.jpg
 - 2043x924_fjnndkk.jpg
 - 9560x12643_fjknfd.jpg
 - 24x24_dnjkan.jpg

이러한 모든 이미지를 새 디렉터리(예 ./images/: )에 수집하고 싶습니다. 간단하게 들리네요.
간단한 정규식은 [0-9]+x[0-9]+.*이러한 파일 이름과 일치하지만 내가 아는 한 정규식을 와 결합할 수 없습니다 mv.
이상적으로는 다음과 같은 것이 작동하기를 원 mv [0-9]+x[0-9]+.* images하지만 물론 그렇지 않습니다.

이 질문은 이전에 여러 번 요청된 것 같습니다. 이 질문과 다른 StackExchange에 대한 유사한 스레드를 수십(문자 그대로!) 살펴봤지만 불행히도 아직 도움이 되는 답변을 보지 못했습니다. 대부분의 경우 허용되는 답변은 단순히 mv정규식 대신 glob을 사용하는 방법을 설명하거나 작성자를 돕기 위해 해당 glob을 제안하지만 제 경우에는 작동하지 않았습니다. 그래서 나는 내 행운을 시험해보고 싶었고 스스로에게 질문을 던지고 싶었습니다. 괜찮기를 바랍니다.

내 패턴을 합리적인 글로브로 압축할 수 없고 정규 표현식이 작동하지 않는 것 같습니다. mv그러면 어떻게 해야 합니까?
당연히 이런 일이 가능하지 않을까요?

열정적인 답변 정말 감사드립니다!

답변1

당신은 그것을 사용할 수 있습니다확장된 글로벌:

extglob내장 옵션을 사용하여 셸 옵션을 활성화 하면 shopt여러 확장 패턴 일치 연산자가 인식됩니다. 아래 설명에서는,패턴 목록" "로 구분된 하나 이상의 패턴 목록입니다 |. 복합 패턴은 다음 하위 패턴 중 하나 이상을 사용하여 형성될 수 있습니다: [...]

+(pattern-list)
주어진 패턴과 하나 이상 일치합니다.

그래서:

shopt -s extglob
mv +([0-9])x+([0-9])* ./images

답변2

다음 루프를 사용하여 목표를 달성할 수 있습니다.

for i in *
do
    echo "$i" | grep -qE "^[[:digit:]]+x[[:digit:]]+.*" && mv "$i" images
done

다음과 같이 정규식을 변경하여 2~5자리 숫자를 지정할 수 있습니다.

for i in *
do
    echo "$i" | grep -qE "^[[:digit:]]{2,5}x[[:digit:]]{2,5}.*" && mv "$i" images
done

답변3

mv $(ls | grep YOUR_REGEX) 대상 디렉토리/

문제를 해결해야 한다

건배

관련 정보