我想编写一个脚本,该脚本将重命名文件并在文件已存在时在末尾附加一个数字。
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
是的。既然您表达了编写脚本的意愿,那么您需要了解以下内容才能完成此任务:
测试文件是否存在:shell表达式
[ -e filename ]
。请参阅该man
页面以了解您可以执行的许多其他测试。为了让人们更好地阅读man
页面,我建议他们习惯于学习如何在长man
页面中搜索项目。通常,现代 Linux 将其man
命令配置为使用less
浏览器。这样,就可以使用正则表达式执行搜索,因此可以通过 找到/
选项的文档(几乎总是以一行开头)。只需按 即可重复。-e
/^ *-e
/
从文件名中删除后缀扩展名:shell 表达式
${var%.*}
将执行此操作,因此将文件名保存在变量中,并对变量执行该操作以获取文件的基本名称。获取文件名的后缀扩展名:
${var##*.}
.再次查看man
您的 shell 的页面(例如man sh
,man bash
)创建一个新文件名:类似
new="${old%.*}${counter}${old##*.}"
因此,您想要执行一个
while
循环,检查新文件名是否不存在,如果存在,则增加一个变量。一旦它不存在,请mv
使用该文件名作为目标执行操作。在 shell 脚本中增加变量可以这样执行
count=$((++count))
:
答案2
根据info '(coreutils) Backup options'
没有办法只得到一个数字作为后缀。 mv --backup=numbered
结果是你已经看到的,mv --suffix=''
结果只是一个~
后缀(尽管有文档),并且合并到mv --backup=numbered --suffix=''
忽略后缀。