하위 폴더의 파일 이름 일괄 변경, 접두사 삭제

하위 폴더의 파일 이름 일괄 변경, 접두사 삭제

임의의 하위 디렉터리에 MP4 파일이 많이 있습니다. 제거해야 할 임의의 접두사가 있습니다. 이 폴더 구조의 예는 다음과 같습니다.

/
../AFolder/Afolder2/123-01-filename.mp4
../BFolder/Bfolder2/512-01-filname.mp4
../CFolder/Cfolder2/881-01-filename.mp4

기본적으로 각 파일 이름 앞의 3자리 숫자와 대시를 제거하고 싶으므로 최종 파일은 다음과 같습니다.

/
../AFolder/Afolder2/01-filename.mp4
../BFolder/Bfolder2/01-filname.mp4
../CFolder/Cfolder2/01-filename.mp4

나는 다음을 통해 이 작업을 수행하려고 합니다.

for file in ./*/*/*mp4
do
    changeto="(echo $name | cut -c4-)"
    echo $name $changeto
    #mv #name $changeto
done

그러나 이렇게 하면 최종 파일뿐만 아니라 모든 디렉터리 + 파일의 처음 4개가 잘립니다.

답변1

쉘 루프 사용에 대한 조언을 따르십시오.

for name in ./*/*/???-*.mp4; do
    filename=${name##*/}         # remove directory path
    filename=${filename#???-}    # remove initial three characters and dash

    # prepend directory path to target filename and rename
    mv "$name" "${name%/*}/$filename"
done

그러면 변경하려는 이름이 반복됩니다. 각 경로 이름에 대해 filename표준 변수 대체를 사용하여 경로 이름의 파일 이름 부분을 변수로 추출합니다. 값에서 처음 세 문자와 대시를 제거합니다. 그런 다음 이 새 값을 사용하여 원본 파일의 이름을 바꿀 수 있습니다 $filename.

파일 이름을 더 엄격하게 일치시켜야 하는 경우 처음 세 문자가 숫자인지 확인하고 ?위 패턴의 각 문자를 [0-9]또는 로 바꾸세요 [[:digit:]].


Perl 유틸리티 사용 rename:

rename -v 's/...-([^\/]*\.mp4)$/$1/' ./*/*/???-*.mp4

이렇게 하면 주어진 각 파일 이름에 Perl 대체가 적용됩니다. 교체는 파일 이름과 일치하지만 끝에 유지하려는 이름의 비트만 캡처합니다(마지막 문자열에는 /제거하려는 세 문자와 대시가 앞에 오는 문자가 포함되어 있지 않습니다). 경로 이름의 일치하는 부분이 캡처된 문자열로 대체됩니다.

답변2

나는 사용하는 것을 좋아한다밀리미터파, 이런 일을 위해서요. 파일을 이동할 때 와일드카드 문자 ? 및 *를 사용할 수 있습니다. 각 와일드카드 문자를 정규식 캡처 그룹으로 처리하는데, 이것이 제가 생각한 것인데 대체 구문에서 그룹에 액세스하기 위해 \ 대신 #을 사용합니다.

문제의 데모는 다음과 같습니다.

$ ls *Folder/*folder2/*
AFolder/Afolder2/123-01-filename.mp4  CFolder/Cfolder2/881-01-filename.mp4 BFolder/Bfolder2/512-01-filname.mp4
$ mmv "*Folder/*folder2/???-*" "#1Folder/#2folder2/#6"
$ ls *Folder/*folder2/*
AFolder/Afolder2/01-filename.mp4  CFolder/Cfolder2/01-filename.mp4 BFolder/Bfolder2/01-filname.mp4

까다로운 부분은 쉘 자체에서 와일드카드를 호출하는 것을 피하기 위해 기본적으로 첫 번째 문자열을 항상 따옴표로 묶어야 한다는 것입니다. 둘째, 각각을 기억하시나요? 자체 그룹이므로 파일 이름 #6의 나머지 부분을 얻는 방법입니다.

답변3

다음을 사용하여 셸을 찾고 호출할 수 있습니다.-exec

find . -type f -exec sh -c '
  for f; do
    d=${f##*/} d=${d#*[0-9][0-9][0-9]-}
    echo mv -v "$f" "${f%'/'*}/$d"
  done
' _ {} +
  • echo는 어떻게/무엇을 해야 하는지 알려줍니다. ouptu가 괜찮다고 생각되면 제거하세요.

실제 출력은 이렇습니다.

산출

renamed './AFolder/Afolder2/123-01-filename.mp4' -> './AFolder/Afolder2/01-filename.mp4'
renamed './BFolder/Bfolder2/512-01-filename.mp4' -> './BFolder/Bfolder2/01-filename.mp4'
renamed './CFolder/Cfolder2/881-01-filename.mp4' -> './CFolder/Cfolder2/01-filename.mp4'

관련 정보