다음으로 끝나는 모든 파일을 찾으려고 합니다.
- 조상-인류-오디세이-예고편-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
원하는 경우 시험 실행을 위해 제거).