구분된 하위 문자열을 제거하여 파일 이름 바꾸기

구분된 하위 문자열을 제거하여 파일 이름 바꾸기

이름이 있는 파일이 포함된 폴더와 하위 폴더가 많이 있습니다. 하위 문자열을 억제하기 1. Introduction--- [ FreeCourseWeb.com ] ---.mp4위해 모든 파일의 이름을 재귀적으로(폴더 및 하위 폴더) 바꾸고 싶습니다 .1. Introduction.mp4--- [ FreeCourseWeb.com ] ---

답변1

이름 시작 부분에 숫자가 있는 모든 파일의 이름을 바꾸려고 한다고 가정하면 하위 문자열이 두 번 포함 되고 바로 이름 끝 부분이 ---뒤따릅니다 . 또한 이러한 하위 문자열 자체를 포함하여 .mp4두 하위 문자열 사이의 비트를 제거한다고 가정합니다 .---

find . -type f -name '[[:digit:]]*---*---.mp4' -exec sh -c '
    for pathname do
        mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
    done' sh {} +

이는 현재 디렉토리 또는 그 아래에서 주어진 패턴과 일치하는 이름을 가진 모든 일반 파일을 찾은 다음 일치하는 접미사 문자열을 제거 ---*---.mp4하고 .mp4접미사를 다시 추가합니다.

find(in )을 사용하지 않고 bash:

shopt -s globstar nullglob dotglob

for pathname in ./**/[[:digit:]]*---*---.mp4; do
    [[ ! -f $pathname ]] && continue
    mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
done

이는 기본적으로 명령과 동일 find하지만 심볼릭 링크의 이름도 변경됩니다. 시작 시 설정된 세 가지 셸 옵션은 **하위 디렉터리까지 반복적으로 일치하는 데 사용되는 globbing 패턴을 활성화하고( globstar) 일치하지 않는 패턴이 확장되지 않은 상태로 유지되는 대신 삭제되도록 하며( nullglob) globbing 패턴이 숨겨진 이름과 일치하는지 확인합니다( dotglob).

셸 에서 zsh:

for pathname in ./**/[[:digit:]]*---*---.mp4(.ND); do
    mv -i $pathname ${pathname%---*---.mp4}.mp4
done

여기서 glob 한정자의 점은 (.ND)이전 패턴이 일반 파일과만 일치하도록 만드는 반면 N및 는 및 in 을 D활성화하는 것처럼 작동 하지만 이 특정 패턴에 대해서만 작동합니다.nullglobdotglobbash

답변2

rename패키지 도구 util-linux(때때로 라고도 함 rename.ul) 및 다음을 사용합니다 find.

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename -i -- '--- [ FreeCourseWeb.com ] ---' '' {} \;

옵션은 -i기존 파일을 덮어쓸 수 있는 권한을 요청합니다.


Larry Wall의 Perl rename스크립트를 사용하여 다음을 수행합니다 find.

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename 's/--- \[ FreeCourseWeb.com \] ---//' {} \;

-f/ --force옵션을 사용 하지 않으면 기본적으로 기존 파일을 덮어쓰지 않습니다 . 대신 오류 메시지가 표시됩니다 ... already exists.

관련 정보