为什么重命名根本不起作用?

为什么重命名根本不起作用?

我需要重命名多个文件,一些教程表明该命令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

相关内容