我有一个 bash 脚本,可将文件从多个不同位置移动到名为 的文件夹completed
。
我想避免覆盖以前的文件,因此如果Selection Of Recipes.zip
我想要移动的文件名(例如, )已经在 中completed
,请在文件名中添加随机数或其他字符串以区分(Selection of Recipes-???.zip
,其中???
是随机字符串) 。
这是否可以仅使用mv
,或者我应该尝试使用处理该方面的参数创建另一个 bash 脚本?有人有一个 bash 脚本可供我自己设计吗?
答案1
如果您使用 GNU,mv
您可以选择以下选项。
$ mv -b source/* dest/.
此开关指示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
现在,当我们将文件从 移动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
您可能应该添加一些验证(例如确保随机编号的文件尚不存在)以及用户提供两个参数的事实。