重命名文件并附加数字(如果文件已存在)

重命名文件并附加数字(如果文件已存在)

我想编写一个脚本,该脚本将重命名文件并在文件已存在时在末尾附加一个数字。

mv a.txt b.txt

由于 b.txt 已经存在,b.txt.1 将是重命名的文件,如果我再次执行此操作,我将得到 b.txt.2,因为 b.txt 存在且 b.txt.1 存在

我知道有一个 mv、mv --backup 选项,但这给了我 b.txt~.1~,但我不想要它之前和之后的 ~。是否还有另一种选择只是附加数字。

答案1

是的。既然您表达了编写脚本的意愿,那么您需要了解以下内容才能完成此任务:

  1. 测试文件是否存在:shell表达式[ -e filename ]。请参阅该man页面以了解您可以执行的许多其他测试。为了让人们更好地阅读man页面,我建议他们习惯于学习如何在长man页面中搜索项目。通常,现代 Linux 将其man命令配置为使用less浏览器。这样,就可以使用正则表达式执行搜索,因此可以通过 找到/选项的文档(几乎总是以一行开头)。只需按 即可重复。-e/^ *-e/

  2. 从文件名中删除后缀扩展名:shell 表达式${var%.*}将执行此操作,因此将文件名保存在变量中,并对变量执行该操作以获取文件的基本名称。

  3. 获取文件名的后缀扩展名:${var##*.}.再次查看man您的 shell 的页面(例如man sh, man bash

  4. 创建一个新文件名:类似new="${old%.*}${counter}${old##*.}"

  5. 因此,您想要执行一个while循环,检查新文件名是否不存在,如果存在,则增加一个变量。一旦它不存在,请mv使用该文件名作为目标执行操作。

  6. 在 shell 脚本中增加变量可以这样执行count=$((++count))

答案2

根据info '(coreutils) Backup options' 没有办法只得到一个数字作为后缀。 mv --backup=numbered结果是你已经看到的,mv --suffix=''结果只是一个~后缀(尽管有文档),并且合并到mv --backup=numbered --suffix=''忽略后缀。

相关内容