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

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

파일 이름이 포함된 폴더와 하위 폴더가 많이 있고 하위 문자열만 억제하기 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(중간 bash):

shopt -s globstar nullglob dotglob

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

이는 본질적으로 동일한 명령이지만 find기호 링크의 이름도 바꿉니다. 처음에 설정된 세 가지 셸 옵션은 **반복적으로 일치하는 하위 디렉터리에 대해 와일드카드 패턴을 활성화하고( globstar), 일치하지 않는 패턴이 확장되지 않은 상태로 남아 있는 대신 제거되도록 하며( nullglob), 와일드카드 패턴이 숨겨진 이름과 일치하는지 확인합니다( dotglob).

zsh셸 에서 :

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

여기서 glob 한정자의 점은 (.ND)이전 패턴이 일반 파일에만 일치하도록 하는 반면 N및 는 및 를 활성화 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.

관련 정보