파일 이름이 포함된 폴더와 하위 폴더가 많이 있고 하위 문자열만 억제하기 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
하는 것처럼 작동 하지만 이 특정 패턴에 대해서만 작동합니다.nullglob
dotglob
bash
답변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
.