find 및 execdir 플래그를 사용하여 제로 패딩 파일 이름

find 및 execdir 플래그를 사용하여 제로 패딩 파일 이름

나는 smplayer를 사용하고 있는데 파일을 자연스러운 순서로 정렬하지 않습니다. 예를 들어 재생 후에 는 대신 1*.sth으로 이동 합니다. 그러나 제가 확인한 대로 파일 이름을 0으로 변경하면 플레이어는 올바른 파일 정렬로 끝납니다. 순서대로. ( 대시, 공백, 점 등과 같은 문자를 의미합니다.) 이제 모든 비디오 및 srt 파일을 확인하고 0으로 채우는 (가능한 경우) 일회성 실행 코드 줄을 작성하려고 합니다. 이름을 바꿔야 하는 모든 파일을 찾는 데 다음 코드가 있습니다.11*.sth2*.sth*

~~~~~ find . -type f -regex "[^0].*\.\(mp4\|srt\)"
find . -type f -name '[1-9]*.mp4' -o -name '[1-9]*.srt'

find . '(' -name '[1-9]*.mp4' -o -name '[1-9]*.srt' ')' -type f

find명령을 실행하는 플래그 가 있고 execdir지정된 명령은 일치하는 파일이 포함된 하위 디렉터리에서 실행된다는 것을 알고 있습니다 . 이 정보는 디렉토리 트리의 최상위 노드에서 결과 명령을 실행하려는 경우 파일이 어디에 있는지 걱정할 필요가 없기 때문에 유용합니다. 이제 문제는 bash 스크립트를 사용하여 파일 이름을 제로 패드하고 이 함수를 -execdir메소드 플래그에 대한 명령 으로 사용하는 방법을 모른다는 것입니다 find.

이 코드는

awk '{ split($0, arr, "/"); print arr[2] }'

나에게 맞는 Python 스크립트가 있는데 이 작업을 수행하기 위해 한 줄짜리 bash 스크립트를 찾고 있습니다.

import subprocess
from pathlib import Path

cmd = r'find ./ -type f -regex "[^0].*\.\(mp4\|srt\)"'
exc = subprocess.check_output(cmd, shell=True)

pathes = list(map(bytes.decode, exc.splitlines()))
files = list(map(Path, pathes))

for file in files:
    if file.name[0].isdigit() and file.name[0] != "0":
        num = ""
        for char in file.name:
            if not char.isdigit():
                break
            num += char
        file.rename(file.with_name(file.name.replace(num, num.rjust(3, "0"))))

여기에 이미지 설명을 입력하세요.

답변1

mp4길이 4에 0을 채우려면(예: 모든 파일의 시작 부분에 있는 숫자) 다음을 srt사용하십시오 zsh.

autoload -Uz zmv
zmv '(**/)(<->)(*.(mp4|srt))(#q.)' '$1${(l[4][0])2}$3'

또는 다음 rename명령이 있는 경우:perlFile::Rename

find . '(' -name '*.mp4' -o -name '*.srt' ')' -type f -print0 |
  rename -0d 's/^\d+/sprintf "%04d", $&/e'

-regex이를 지원하는 구현 에서는 find파일 이름뿐만 아니라 전체 경로와 일치하며 기본적으로 고정됩니다 .

존재하다

find . -type f -regex "[^0].*\.\(mp4\|srt\)"

모든 경로는 로 시작합니다 ./. 예를 들어 ./dir/01.mp4, ( ) 이외의 문자로 시작하고 그 뒤에 0개 이상의 문자가 오고 그 뒤에 가 오기 때문에 이 정규식과 일치할 수 있습니다 .0..mp4

의미하는 바는 다음과 같습니다.

find . '(' -name '[123456789]*.mp4' -o -name '[123456789]*.srt' ')' -type f

일반 파일 찾기이름0이 아닌 숫자로 시작하세요.

또는:

find -E . -regex '.*/[0123456789]{1,3}([^0123456789/][^/]*)?\.(mp4|srt)' -type f

이름이 4보다 작은 일련의 숫자로 시작하는 일반 파일에 적용됩니다.

findGNU 라면 BSD에서 동등한 구현 find-E .위해 .. -regextype posix-extended-Efind

관련 정보