여러 파일의 이름을 바꿔야 하는데 일부 튜토리얼에서는 각 파일 rename
에 대해 이 명령을 사용하는 대신 이 명령이 가장 좋은 옵션이라고 제안합니다 mv
.
하지만 다음 파일이 있습니다.
ReconhecimentoImagens2021-10-18--2020-2.mp4 ReconhecimentoImagens2021-11-01--2020-2.mp4 ReconhecimentoImagens2021-11-22--2020-2.mp4
ReconhecimentoImagens2021-10-25--2020-2.mp4 ReconhecimentoImagens2021-11-08--2020-2.mp4 ReconhecimentoImagens2021-11-24--2020-2.mp4
'ReconhecimentoImagens2021-11-01--2020-2(2).mp4' ReconhecimentoImagens2021-11-17--2020-2.mp4 ReconhecimentoImagens2021-11-29--2020-2.mp4
테스트를 위해 다음 명령을 시도했습니다.
rename 's/2021/ /' *.mp4
아무 일도 일어나지 않습니다. 맨 페이지에 따르면 "이름 변경 없음"을 의미하는 코드 4가 표시됩니다.
여러 튜토리얼을 검색했는데 아무도 다른 작업을 수행하지 않는 것 같습니다. 그렇다면 여기서 내가 뭘 잘못하고 있는 걸까요?
답변1
이름 바꾸기에는 다양한 버전이 있으며 해당 버전은 PERL 정규식을 지원하지 않습니다.
rename.pl
대부분의 Linux 배포판과 기타 Unixoid 시스템에는 Perl 또는 간단한 명령 으로 빌드된 패키지가 있습니다 .rename
귀하의 사용 사례에서는 "클래식" util-linux이면 rename
충분합니다.
rename "2021" " " *.mp4
할 것입니다.
솔직히 말해서, 내 쉘은 이 모든 놀라운 일들을 기억할 필요가 없을 만큼 충분히 잘 작동하고 있습니다. 한 번 배워서 sed
어느 정도 괜찮았습니다. 쉘 구문을 한 번 배웠 for
더니 이렇습니다.
for filename in *.mp4 ; do
mv "${filename}" "$(echo "${filename}" | sed 's/regex/replacement/')"
done
적어도 나에게는 기억하기 쉽고 bash, zsh 및 기타 Bourne과 같은 쉘에서 작동해야 합니다. 내가 배워야 할 추가 명령이 아닙니다.
실제로 일을 단순하게 유지하려면 자신이 선호하는 셸의 변수 확장을 최대한 활용할 수 있습니다.
#!/usr/bin/env zsh
if [[ "${#}" -lt 2 ]] ; then
echo "Usage: ${0} [-r] PATTERN REPLACEMENT [FILE...]"
echo "Uses normal Zsh globbing for pattern, unless -r is specified:"
echo "In that case, use the regexp-replace loadable ZSH function"
exit 1
fi
if [[ "${1}" = "-r" ]]; then
autoload regexp-replace
REGEX=1
shift 1
else
set -o extendedglob
REGEX=0
fi
PATTERN="${1}"
REPLACEMENT="${2}"
shift 2
if [[ "${REGEX}" -eq 0 ]]; then
for filename in ${argv} ; do
mv "${filename}" "${filename/${1}/${2}}" || echo "Problem renaming ${filename}" >&2
done
else
for filename in ${argv} ; do
original_filename="${filename}
regexp_replace filename "${PATTERN}" "${REPLACEMENT}"
mv "${original_filename} "${filename}" || echo "Problem renaming ${original_filename}" >&2
done
fi