我需要重命名多个文件,一些教程表明该命令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 正则表达式。
对于大多数 Linux 发行版和其他 unixoid 系统,有一些软件包包含从 perl 构建的rename.pl
或 简单命令。rename
在您的用例中,“经典”util-linuxrename
完全足够了:
rename "2021" " " *.mp4
会做。
老实说,我的 shell 做得足够好,我不需要记住所有这些美好的事情。我学过sed
一次,有点OK,我学过for
一次 shell 的语法,就是这样:
for filename in *.mp4 ; do
mv "${filename}" "$(echo "${filename}" | sed 's/regex/replacement/')"
done
至少对我来说很容易记住,并且应该可以在 bash 和 zsh 以及其他类似 bourne 的 shell 中工作。不是我必须学习的额外命令。
事实上,如果你想让事情变得简单,你可以最大限度地使用你自己喜欢的 shell 的变量扩展:
#!/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