如何在 bash 中重命名多个文件(不是通过模式,而是提示每个新名称)?

如何在 bash 中重命名多个文件(不是通过模式,而是提示每个新名称)?

我想重命名目录中的所有文件。新名称不遵循任何模式,因此我无法使用rename。有没有有效的方法可以做到这一点,这样我就不必mv foo.txt bar.txt对每个文件都使用?

答案1

当考虑将其编写为脚本时,我检查了可能的名称是否已被使用,结果发现我猜“交互式移动”已经编写并可以使用。对于大多数系统,它应该在重命名实用程序包,其中包含各种非常有用的工具:

  • qmv/qcp:快速移动/复制,将所有文件名写入可编辑的文本文件。
  • 国际医学影像学会:交互式移动/复制,要求输入文件的新名称。

imv在这种情况下, /的问题icp是,它们只接受一个参数:

imv FILENAME

多个参数将导致错误。因此,您基本上必须将其包装在一个短for循环中:

for file in *; do imv "$file"; done

.bashrc这当然很难输入,所以我们应该将其包装成一个可以放在我们的文件中的现成函数。

# Mass Interactive Move
function mimv {
    for file in "$*"; do
        imv "$file"
    done
}

幸运的是,imv显示了当前正在处理的文件的名称,所以我们不需要任何 echo 语句,这样我们就知道发生了什么。

答案2

您可以使用此命令:

for i in *; do
   read -p "$i -> " newname
   if [[ ! -z "$newname" ]]; then
      mv -v -- "$i" "$newname"
   fi
done

它会提示您为for i in *当前目录中的每个文件和每个目录 ( ) 输入新名称。新名称将被读入$newname。如果您点击Enter而不输入新名称,则不会执行任何操作(-z $newname检查,如果$newname为空(ero);!是合乎逻辑的not,否则mv用于重命名文件。


如果你只想稍微改变文件名,那么更有效的方法是编辑它以旧文件名开头,正如@grawity 所建议的:

for i in *; do
   read -p "$i -> " -e -i "$i" newname
   if [[ ! -z "$newname" ]]; then
      mv -v -- "$i" "$newname"
   fi
done

我用包含空格和括号的文件名进行了测试,但请自行承担使用风险(并提前备份原始文件)。

答案3

/usr/bin/env bash

对于 $( echo * ) 中的文件;
     echo -n 将 $files 重命名为哪个名字?;
     读取新名称;
     mv“$files”“$new_name”;
完毕

相关内容