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

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

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

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

这是否可以仅使用mv,或者我应该尝试使用处理该方面的参数创建另一个 bash 脚本?有人有一个 bash 脚本可供我自己设计吗?

答案1

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

$ mv -b source/* dest/.

此开关指示mvdest/.目录中冲突的所有文件推送到备份版本,通常~在将文件移动到目录之前在文件末尾添加波形符 ( )。

例子

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

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

$ tree
.
├── dest
│   ├── file1
│   ├── file2
│   ├── file3
│   ├── file4
│   └── file5
└── source
    ├── file1
    ├── file2
    └── file3

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

$ mv -b source/* dest/.
$ tree 
.
├── dest
│   ├── file1
│   ├── file1~
│   ├── file2
│   ├── file2~
│   ├── file3
│   ├── file3~
│   ├── file4
│   └── file5
└── source

2 directories, 8 files

控制扩展

同样,对于 GNU 版本,mv您可以使用开关更改默认行为-S <string>

$ mv -b -S "string" source/* dest/.

例子

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

$ tree 
.
├── dest
│   ├── file1
│   ├── file1.old
│   ├── file2
│   ├── file2.old
│   ├── file3
│   ├── file3.old
│   ├── file4
│   └── file5
└── source

2 directories, 8 files

答案2

这是脚本。如果你调用它move,你将不得不使用命令move file destination

#!/bin/bash

FILE=$1
DEST=$2

if `ls ${DEST}/${FILE} > /dev/null`
then
    base=`echo ${FILE} | sed 's/\(.*\)\..*/\1/'`
    ext=`echo ${FILE} | sed 's/.*\.\(.*\)/\1'`
    r=$RANDOM
    mv ${FILE} ${DEST}/${base}-${r}.${ext}
else
    mv ${FILE} ${DEST}
fi

您可能应该添加一些验证(例如确保随机编号的文件尚不存在)以及用户提供两个参数的事实。

相关内容