假设我的文件夹中有以下文件:
cat.txt
dog.txt
house.txt
tree.txt
我想将它们全部重命名为如下名称:
file1.txt
file2.txt
file3.txt
file4.txt
可以通过命令行完成吗?
我只看到有关重命名具有某种模式的文件的问题,例如 rename dog1.txt
,dog2.txt
-> cat1.txt
,cat2.txt
。
答案1
使用rename
实用程序来执行此操作:
rename -n '$_ = sprintf "file%d.txt", ++$::count' *
笔记
-n
让命令显示运行该命令后会发生什么。如果输出符合您的要求,则运行该命令而不-n
实际重命名文件。- 将 替换
*
为您想要重命名的内容,例如:dog*.txt
仅重命名dog1.txt
,dog2.txt
... 至file1.txt
,file2.txt
,等等。 $_
是我们应该修改的默认输入(文件名)。- 使用
=
我们正在修改它 - 我们
sprintf
定义一个以开头、以 结尾的file
模式。%d
.txt
- 将使用 分配数字(%d)
++$::count
,这是每次重命名后迭代的简单计数器。
这个想法来自于这里。
答案2
它或许完成了,但有一些注意事项。您已经声明“...这些文件在我的文件夹中”,这将是其中的一个注意事项。我们可以使用globstar
并迭代扩展的文件名:
$ c=0;for f in *; do ((c++)); echo "$f" "--->" file"$c".txt ; done
cat.txt ---> file1.txt
dog.txt ---> file2.txt
house.txt ---> file3.txt
tree.txt ---> file4.txt
当然,你总是可以通过 来“手动”操作list.txt
,你可以存储文件名列表并通过while IFS= read -r ; do ... done < list.txt
$ c=0; while IFS= read -r f; do ((c++)); echo "$f" file"$c" ; done < input.txt
cat.txt file1
dog.txt file2
tree.txt file3
当然,这个列表主题可以以多种方式扩展 - csv 列表、json 文件、键值列表 - 随便你怎么说。网上有很多关于这些的问题。当然,你还必须做出其他选择,例如提供文件的完整路径或在与列表相同的目录中执行所有操作。
最后,我已经提到了键值列表。使用bash
Python 或 Perl 等其他更现代的脚本语言,您可以创建一个哈希表(或字典),其中包含文件列表和您希望文件具有的相应新名称。