mv:如果目标存在,则将数字添加到文件名

Qoh*_*let 7 rename mv

我正在将文件移动到不同的文件夹,如果已经存在同名文件(旧文件应保持不变),我想为新移动的文件添加某种索引。例如,如果file.pdf存在,我更喜欢类似file1.pdffile_1.pdf下一个具有相同名称的文件。

在这里,我发现了一个相反想法的变体——但我不想做一个“备份”。

mv对于这种情况,是否有一些现成的参数?我使用 Ubuntu Linux。

Byt*_*der 8

正如您链接的问题的答案已经指出的那样,mv可以为文件添加后缀,否则这些文件将被您移动的文件覆盖,并为它们提供一个唯一的文件名:

mv --backup=t <source_file> <dest_file>
Run Code Online (Sandbox Code Playgroud)

该命令的工作方式是将下一个未使用的数字后缀附加到目标目录中的第一个文件。您正在移动的文件将保留其原始名称。

但是,这会附加后缀,例如.~1~,这似乎不是您想要的:

$ ls
file.pdf
file.pdf.~1~
file.pdf.~2~
Run Code Online (Sandbox Code Playgroud)

您可以在第二步中重命名这些文件,以便以类似file_1.pdf而不是 的格式获取名称file.pdf.~1~,例如像这样:

rename 's/((?:\..+)?)\.~(\d+)~$/_$2$1/' *.~*~
Run Code Online (Sandbox Code Playgroud)

这会获取以不需要的备份后缀结尾的所有文件(通过与 shell glob 匹配*.~*~),并让该rename工具尝试匹配((?:\..+)?)\.~(\d+)~$文件名上的正则表达式。如果匹配,它将从.~1~-like 后缀中捕获索引作为第二组 ( $2),并且可选地,如果文件名在该后缀之前具有扩展名,例如.pdf,它将被第一组 ( $1)捕获。然后它将完整匹配的文件名部分替换为_$2$1,插入捕获的值而不是占位符。

基本上它会重命名例如file.pdf.~1~tofile_1.pdfsomething.~42~to something_42,但它无法检测文件是否有多个扩展名,所以 egarchive.tar.gz.~5~会变成archive.tar_5.gz

  • 也可以使用 `--backup=numbered` 代替 `--backup=t` (2认同)