찾기를 사용하여 정규식으로 파일 이름을 검색하고 이 파일의 이름을 바꾸는 방법

찾기를 사용하여 정규식으로 파일 이름을 검색하고 이 파일의 이름을 바꾸는 방법

다음으로 끝나는 모든 파일을 찾으려고 합니다.

  • 조상-인류-오디세이-예고편-720-1262.mp4
  • 하이테크 다이버-1080-1234.mp4
  • 아마존 다이버-720-1323.mp4

다음과 같이 파일 이름을 바꿉니다.

  • 720-1262.mp4
  • 1080-1234.mp4
  • 720-1323.mp4

정규식을 사용했지만 아무것도 작동하지 않았습니다. 이유는 무엇입니까? 뭐가 문제 야?

find . -regex '^.*-(([0-9])*-([0-9])*)\.mp4'

디렉터리는 하나만 있고 이러한 파일은 하위 디렉터리가 없습니다. 약 300개의 .mp4 파일

답변1

GNU는 find여러 정규식 방언을 지원합니다(이 -regextype옵션을 사용하면 하나를 선택할 수 있습니다). 괄호 중 일부는 특수 문자이고 다른 괄호에서는 특별한 의미를 얻으려면 백슬래시를 이스케이프 처리해야 합니다.

~에 따르면온라인 문서, 사용되는 기본 방언 -regex은 "POSIX basic"입니다.매뉴얼 페이지인터넷에서는 기본 방언이 "Emacs"라고 합니다 1 . 두 대괄호 모두 그룹화 문자로 사용하려면 대괄호를 백슬래시로 이스케이프해야 합니다.

다음은 작동합니다.

find . -regex '^.*-\(\([0-9]\)*-\([0-9]\)*\)\.mp4'
find . -regextype posix-extended -regex '^.*-(([0-9])*-([0-9])*)\.mp4'

그러나 ^여기서는 이것이 필요하지 않으며( -regex파일 이름에 대해 정확한 일치 수행) 따라서 그룹화가 필요하지 않은 것 같습니다.

find . -regex '.*-[0-9]*-[0-9]*\.mp4'

충분해야 합니다(데이터 정렬과 관련된 잠재적인 문제를 제쳐두고: 로케일에 따라 [0-9]더 많은 것이 일치할 수 있습니다 ).[0123456789]

이름 바꾸기에 관해서: Perl 구현 rename(사용할 수 있는 경우)이 편리한 선택이 될 것입니다. 이름을 바꿀 모든 파일이 현재 작업 디렉토리에 있다고 가정합니다(필수는 아님 find).

perl-rename -nv 's/.*-(\d*-\d*\.mp4)\Z/$1/' -- *

(이는 \Z주제 2$ 의 끝 부분에서 일치하는 표준 정규식 과 동일합니다).

n명령의 기능이 만족스러우면 (시험 실행) 옵션을 제거하십시오.

알아채다

  • --.mp4이름은 다음과 같이 변경됩니다 -.mp4. \d+마지막 숫자 앞뒤에 최소한 하나의 숫자가 나타나도록 요구하는 데 사용됩니다.-
  • .*또한 숨겨진 파일의 이름을 바꿔야 합니다.

또는 GNU find및 표준 mv유틸리티를 사용하여(또한 하위 디렉터리로 재귀적으로 내림차순으로):

find . -regex '.*-[0-9]*-[0-9]*\.mp4' -execdir sh -c '
  for file; do
    toremove=${file%-*-*.mp4}
    echo mv -- "$file" "${file#"$toremove"-}"
  done' mysh {} +

echo명령의 기능이 만족스러우면 삭제하십시오.


¹ 다음과 같이스티븐 차제라스의견에서 지적했듯이 문서의 부정확성/불일관성과 관련하여 savannah.org에 여러 가지 버그 보고서가 제출되었습니다.https://savannah.gnu.org/bugs/?58384,https://savannah.gnu.org/bugs/?52592,https://savannah.gnu.org/bugs/?61304
² Perl의 $일치는 주제 끝 부분에 있지만 주제 끝의 개행 이전에도 있으므로 구분 기호를 포함하거나 포함하지 않을 수 있는 텍스트 줄을 처리할 때는 괜찮지만 다음을 \Z처리할 때는 제대로 작동하지 않습니다. 여기에는 파일 이름과 같은 다른 것이 있습니다.

답변2

그리고 zsh:

autoload zmv
zmv -n '(**/)*-(<->-<->.mp4)' '$1$2'

( -n원하는 경우 시험 실행을 위해 제거).

관련 정보