移动(文件|目录)同时避免文件名冲突

tas*_*ian 2 bash shell-script mv

我有一个 bash 脚本,可将文件从多个不同位置移动到名为completed.

我想避免覆盖以前的文件,因此如果Selection Of Recipes.zip我要移动的文件名(例如)已经在 中completed,请在文件名中添加随机数或其他字符串以区分(Selection of Recipes-???.zip,其中???是随机字符串) .

这是可能的mv,还是我应该尝试使用处理该方面的参数创建另一个 bash 脚本?有没有人有一个 bash 脚本,我可以用我自己的模式来对抗它?

slm*_*slm 5

如果您使用 GNU,mv您有以下选项。

$ mv -b source/* dest/.
Run Code Online (Sandbox Code Playgroud)

此开关告诉mv将目录中冲突的任何文件推dest/.送到备份版本,通常~在将文件移动到目录之前在文件末尾添加波浪号 ( )。

例子

假设我有以下包含文件的示例目录。

$ mkdir source dest
$ touch source/file{1..3} dest/file{1..5}

$ tree
.
??? dest
?   ??? file1
?   ??? file2
?   ??? file3
?   ??? file4
?   ??? file5
??? source
    ??? file1
    ??? file2
    ??? file3
Run Code Online (Sandbox Code Playgroud)

现在,当我们将文件从 移动source到 时dest

$ mv -b source/* dest/.
$ tree 
.
??? dest
?   ??? file1
?   ??? file1~
?   ??? file2
?   ??? file2~
?   ??? file3
?   ??? file3~
?   ??? file4
?   ??? file5
??? source

2 directories, 8 files
Run Code Online (Sandbox Code Playgroud)

控制扩展

再次使用 GNU 版本,mv您可以使用-S <string>开关更改默认行为。

$ mv -b -S "string" source/* dest/.
Run Code Online (Sandbox Code Playgroud)

例子

$ mv -b -S .old source/* dest/.

$ tree 
.
??? dest
?   ??? file1
?   ??? file1.old
?   ??? file2
?   ??? file2.old
?   ??? file3
?   ??? file3.old
?   ??? file4
?   ??? file5
??? source

2 directories, 8 files
Run Code Online (Sandbox Code Playgroud)