나는 smplayer를 사용하고 있는데 파일을 자연스러운 순서로 정렬하지 않습니다. 예를 들어 재생 후에 는 대신 1*.sth
으로 이동 합니다. 그러나 제가 확인한 대로 파일 이름을 0으로 변경하면 플레이어는 올바른 파일 정렬로 끝납니다. 순서대로. ( 대시, 공백, 점 등과 같은 문자를 의미합니다.) 이제 모든 비디오 및 srt 파일을 확인하고 0으로 채우는 (가능한 경우) 일회성 실행 코드 줄을 작성하려고 합니다. 이름을 바꿔야 하는 모든 파일을 찾는 데 다음 코드가 있습니다.11*.sth
2*.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
명령이 있는 경우:perl
File::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보다 작은 일련의 숫자로 시작하는 일반 파일에 적용됩니다.
find
GNU 라면 BSD에서 동등한 구현 find
을 -E .
위해 .. -regextype posix-extended
-E
find